SHA1对多语言字符串求和

时间:2014-12-22 21:40:58

标签: java javascript android node.js

我有一个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();
    }

1 个答案:

答案 0 :(得分:1)

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

事实证明,我需要做的就是改变这一点:

shasum.update(fieldValue);

到此:

shasum.update(fieldValue, 'utf8');

如hashjs crypto文档中所述,用于哈希编码:http://nodejs.org/api/crypto.html#crypto_hash_update_data_input_encoding

虽然这有效,但在威廉在以下评论中说明,在客户端表示字符集也是一个好主意。

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

md.update(value.getBytes());

到这个

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