用JavaScript计算SHA1哈希,UTF-16字符串有问题

问题描述

我正在编写一个使用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 (将#修改为@)