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=


[![crypto.rar](//ask.dcloud.net.cn/file/download/file_name-Y3J5cHRvLnJhcg==__url-Ly9pbWctY2RuLXRjLmRjbG91ZC5uZXQuY24vdXBsb2Fkcy9xdWVzdGlvbnMvMjAyMTAzMjYvNGFhMDhlYTYxZTg4MWIxYzUwZjk4OWEwMGQ1MzlkNTA=)](//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

6 回复

仅安卓这样吗?ios 是否正常?

更多关于uni-app平台下Crypto.util.bytesToBase64转码与H5平台下转码不一致的实战教程也可以访问 https://www.itying.com/category-93-b0.html


IOS还没有测试。我没有机器,这边你们可以看下,加密这块,同算法结果不一致,挺尴尬的。

我也遇到这个问题了 有处理办法没?

前端,没有办法解决;官方貌似也不重视这个问题。我是通过后台做了转换返回的。然后避规了这个问题。

试了下官方提供了个API,这个在安卓和ios平台算出来是统一的 https://uniapp.dcloud.io/api/arrayBufferToBase64.html#arraybuffertobase64

在uni-app平台下,Crypto.util.bytesToBase64转码结果与H5平台不一致,这通常是由于不同平台对字节数组处理方式存在差异导致的。uni-app在某些环境下可能对字节数组的编码处理与标准Web环境不同。

建议检查以下几点:

  1. 确认使用的CryptoJS库版本是否一致,不同版本可能存在编码差异。
  2. 在uni-app中,尝试使用uni.arrayBufferToBase64方法替代Crypto.util.bytesToBase64进行转码。
  3. 确保字节数组的数值范围在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
回到顶部