NodeJS"加密" hash似乎比Crypto-JS javascript库产生不同的输出

时间:2012-12-22 05:08:48

标签: node.js hash cryptography sha sha256

我在服务器端使用NodeJS的捆绑crypto模块进行SHA256散列。 在客户端,我使用的是名为Crypto-JS的JavaScript库。

我使用SHA256哈希用于使用基于经典随机数的身份验证的登录系统。但是,即使哈希消息相同,我的服务器端和客户端哈希摘要也不匹配(我已经检查了这一点)。甚至散列摘要的长度也不同。

这是我的客户端实现的片段:

var password_hash = CryptoJS.SHA256( token.nonce /*this is the server's nonce*/ + cnonce + password ).toString(CryptoJS.enc.Base64);

这是我服务器端实现的一小部分:

var sha256 = CRYPTO.createHash("sha256");
sha256.update(snonce+cnonce+password, "utf-8");
var hash = sha256.digest("base64");

这是一些示例数据:

client-digest: d30ab96e65d09543d7b97d7cad6b6cf65f852f5dd62c256595a7540c3597eec4
server-digest: vZaCi0mCDufqFUwVO40CtKIW7GS4h+XUhTUWxVhu0HQ=

client-message: O1xxQAi2Y7RVHCgXoX8+AmWlftjSfsrA/yFxMaGCi38ZPWbUZBhkVDc5eadCHszzbcOdgdEZ6be+AZBsWst+Zw==b3f23812448e7e8876e35a291d633861713321fe15b18c71f0d54abb899005c9princeofnigeria
server-message: O1xxQAi2Y7RVHCgXoX8+AmWlftjSfsrA/yFxMaGCi38ZPWbUZBhkVDc5eadCHszzbcOdgdEZ6be+AZBsWst+Zw==b3f23812448e7e8876e35a291d633861713321fe15b18c71f0d54abb899005c9princeofnigeria 

有谁知道为什么哈希不同?我认为如果它是相同的协议/算法,它将始终产生相同的散列。

编辑:哇。我去了这个online hashing tool,它为同一个消息产生了另一个摘要:

4509a6d5028b217585adf41e7d49f0e7c1629c59c29ce98ef7fbb96c6f27502c

修改编辑:第二个想法,在线哈希工具不同的原因可能是因为它使用了hex编码而我使用了base64

2 个答案:

答案 0 :(得分:5)

问题确实存在于编码中。

查看客户端实现:

var password_hash = CryptoJS.SHA256(message).toString(CryptoJS.enc.Base64);

CryptoJS.enc.Base64参数实际上需要CryptoJS库中我没有包含的另一个组件(存储在js文件中:enc-base64-min.js)。因此,如果没有有效的编码类型,则默认为hex

感谢@dhj指出编码问题!

答案 1 :(得分:1)

问题是您的客户端生成十六进制编码的摘要,而服务器使用base64编码。