gpt4 book ai didi

java - 多语言字符串的 SHA1 总和

转载 作者:行者123 更新时间:2023-12-03 11:10:40 24 4
gpt4 key购买 nike

我有一个 Android 应用程序,通过 http 与 Nodejs 服务器通信。

对于每个请求,我都会添加一个 SHA1 校验和,该校验和会迭代我发送到服务器的键值对,以便服务器在到达时对其进行验证。

我已经对此进行了测试,只要我发送的值是英文,它就可以正常工作。例如,发送包含希伯来语字符串值或包含非标准字符(如 é、ç 或 à)的请求将导致请求因校验和不匹配而失败。

首先在andoird客户端(JAVA)中计算校验和,然后在nodejs服务器中进行验证。

我通过发送单个字母值消除了由于希伯来语从右到左的性质导致的可能性,但仍然失败。

什么可能导致这种情况?我认为这可能是因为 JAVA 字符串对非标准字符的编码与 Nodejs 的编码不同。但我该如何解决这个问题呢?

以下是服务器端的相关代码:

var shasum = crypto.createHash('sha1');
while (fieldsPointer < allFields.length
|| filesPointer < allFiles.length) {
shasum.update(fieldKey);
let fieldKey = allFields[fieldsPointer];
shasum.update(fieldKey);
let fieldValue = fields[allFields[fieldsPointer]];
shasum.update(fieldValue);
}

和客户端:

   try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
for(Entry<String, Object> entry : allParams.entrySet()) {
md.update(entry.getKey().getBytes());
if(entry.getValue() instanceof String) {
String value = (String) entry.getValue();
md.update(value.getBytes());
} else (...) // some other instance checking for non String values
}
String checksum = bytesToHex(md.digest());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

最佳答案

我根据威廉姆斯的评论做了一些研究。

事实证明我需要做的就是改变这个:

shasum.update(fieldValue);

对此:

shasum.update(fieldValue, 'utf8');

如 Nodejs 加密文档中所述,哈希编码:http://nodejs.org/api/crypto.html#crypto_hash_update_data_input_encoding

虽然这有效,但在客户端声明字符集也是一个好主意,正如 William 在下面的评论中所述。

我通过改变这个来做到这一点:

md.update(value.getBytes());

到此

md.update(value.getBytes("utf8"));

关于java - 多语言字符串的 SHA1 总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27610851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com