uni-app平台下Crypto.util.bytesToBase64转码与H5平台下转码不一致
uni-app平台下Crypto.util.bytesToBase64转码与H5平台下转码不一致
示例代码:
var policyText = {
"expiration": "2021-03-26T17:00:00.000Z", //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了
"conditions": [
["content-length-range", 0, 1048576000] // 设置上传文件的大小限制
]
};
var policyBase64 = Base64.encode(JSON.stringify(policyText))
message = policyBase64
var bytes = Crypto.HMAC(Crypto.SHA1, message, accesskey, { asBytes: true }) ;
console.log('xxxxxxxxx1>>' + bytes );
var signature = Crypto.util.bytesToBase64(bytes);
console.log('xxxxxxxxx2>>' + signature );
### 操作步骤:
1
预期结果:
1
### 实际结果:
1
bug描述:
同一的crypto.js文件下: 75,145,69,58,113,73,134,250,144,4,238,196,168,129,24,138,79,232,218,29
使用 Crypto.util.bytesToBase64(bytes); 转上面一串码。在uni-app平台下,会得出 S8KRRTpxScKGw7rCkATDrsOEwqjCgRjCik/DqMOaHQ== 在H5 浏览器平台上会得出: S5FFOnFJhvqQBO7EqIEYik/o2h0=
[](//ask.dcloud.net.cn/file/download/file_name-Y3J5cHRvLnJhcg==__url-Ly9pbWctY2RuLXRjLmRjbG91ZC5uZXQuY24vdXBsb2Fkcy9xdWVzdGlvbnMvMjAyMTAzMjYvNGFhMDhlYTYxZTg4MWIxYzUwZjk4OWEwMGQ1MzlkNTA=)
| 信息项 | 详情 |
|--------------|-------------------------------|
| 产品分类 | uniapp/App |
| PC开发环境 | Windows |
| PC版本号 | 10 |
| HBuilderX | 正式 |
| HBuilderX版本 | 3.1.4 |
| 手机系统 | Android |
| 手机系统版本 | Android 11 |
| 手机厂商 | 华为 |
| 手机机型 | P30 |
| 页面类型 | vue |
| 打包方式 | 云端 |
| 项目创建方式 | HBuilderX |
更多关于uni-app平台下Crypto.util.bytesToBase64转码与H5平台下转码不一致的实战教程也可以访问 https://www.itying.com/category-93-b0.html
仅安卓这样吗?ios 是否正常?
更多关于uni-app平台下Crypto.util.bytesToBase64转码与H5平台下转码不一致的实战教程也可以访问 https://www.itying.com/category-93-b0.html
IOS还没有测试。我没有机器,这边你们可以看下,加密这块,同算法结果不一致,挺尴尬的。
我也遇到这个问题了 有处理办法没?
前端,没有办法解决;官方貌似也不重视这个问题。我是通过后台做了转换返回的。然后避规了这个问题。
在uni-app平台下,Crypto.util.bytesToBase64
转码结果与H5平台不一致,这通常是由于不同平台对字节数组处理方式存在差异导致的。uni-app在某些环境下可能对字节数组的编码处理与标准Web环境不同。
建议检查以下几点:
- 确认使用的CryptoJS库版本是否一致,不同版本可能存在编码差异。
- 在uni-app中,尝试使用
uni.arrayBufferToBase64
方法替代Crypto.util.bytesToBase64
进行转码。 - 确保字节数组的数值范围在0-255之间,避免平台间的数值处理差异。
可以尝试以下替代方案:
// 将字节数组转换为ArrayBuffer
var arrayBuffer = new Uint8Array(bytes).buffer;
// 使用uni-app提供的base64转换方法
var signature = uni.arrayBufferToBase64(arrayBuffer);
如果问题仍然存在,可能需要考虑在不同平台使用不同的编码实现,通过条件编译来区分处理:
// #ifdef H5
var signature = Crypto.util.bytesToBase64(bytes);
// #endif
// #ifdef APP-PLUS
var arrayBuffer = new Uint8Array(bytes).buffer;
var signature = uni.arrayBufferToBase64(arrayBuffer);
// #endif