问题描述
我正在编写一个使用AES-128与Java编写的服务器通信的javascript客户端。服务器使用SHA1哈希从字符串生成密码。然后为服务器加密数据。这适用于ASCII字符,但不适用于javascript中较高的unicode字符,因为js字符串位于UTF-16中,因此对字符串的字节进行哈希处理会得出不同的结果。我使用的测试套件的密码包含£。在UTF-16中为0x00a3,在UTF-8中为0xC2 0xA3。我不知道如何将UTF-16 Unicode代码点转换为UTF-8的uint8array。我尝试使用TextEncoder / TextDecoder失败。
以下代码显示了问题。使用java,C#和perl,预期的base64编码哈希(对于AES-128密钥被截断为16个字节)以+ guOwqu6 / gVmQzArLrzGQg ==的形式出现。运行下面的JavaScript,我会得到1nNTS1vHThwvV7lUI0EB9g ==。
addEventListener
这是一个Perl程序,几乎可以完成相同的操作。它不会截断为16个字节,但是输出应该匹配到最后几个字符。
const crypto = require('crypto');
function getSecretKey(key) {
var hasher = crypto.createHash('sha1');
const data = hasher.update(Buffer.from(key,'utf16le'));
return data.digest().slice(0,16).toString('base64');
}
console.log(getSecretKey("abcd£"));
必须有一种方法可以从UTF-16代码点的JavaScript字符串中创建UTF-8字符的Buffer或uint8Buffer。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)