【问题标题】:What's wrong in this SHA-256 Javascript code?这个 SHA-256 Javascript 代码有什么问题?
【发布时间】:2015-04-14 08:39:56
【问题描述】:
var secure;
var authentic;
secure = prompt("Enter password","");
alert(secure);

var c1 = CryptoJS.SHA256(secure);
alert(c1);


authentic = prompt("Enter password","");
alert(authentic);
var c2=CryptoJS.SHA256(authentic);
alert(c2);

if(c1==c2)
{
    alert("hi");
}
else
{
    alert("bye");
}

我使用脚本“http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha256.js

解释:我想做的是比较哈希密码。如果输入的密码(安全和真实)都经过哈希处理(分别为 c1 和 c2)相等,它必须向我显示“hi” .但我发现它总是向我显示“再见”。

问题:当我比较 c1 和 c2 时,我得到的结果总是“再见”,尽管当我使用警告框显示 c1 和 c2 时它们的值是相同的。

我对散列有点陌生。非常感谢您的帮助!

【问题讨论】:

  • 你的比较不好,你需要一个'时间常数'字符串比较来防止定时攻击
  • @RichieFrame 很难说,因为整件事毫无意义。 Unsalted SHA-2,客户端对比,我都不知道从何说起……
  • 使用适当的缩进。
  • 我正在尝试将数据存储在客户的网络浏览器中,所以以后如果他们想访问它,他们必须提供密码!
  • 如果您使用密码生成加密密钥,则需要使用基于密码的密钥派生函数,而不是哈希,此时您不会将密钥与已知密钥进行比较,你用它来尝试解密

标签: javascript hash passwords sha cryptojs


【解决方案1】:

来自the docs

您返回的哈希还不是字符串。它是一个 WordArray 对象。在字符串上下文中使用 WordArray 对象时,它会自动转换为十六进制字符串。

当您在 JavaScript 中比较对象时,您是在测试它们是否是 相同的 对象,而不是它们是否是相同的对象。

由于您创建了两个 WordArray,因此您正在比较两个不同(但可能相同)的对象。

您需要将它们转换为字符串。

if ( (''+c1) == (''+c2) ) 

if ( c1.toString() == c2.toString() )

【讨论】:

  • 太棒了!先生非常感谢您!很抱歉,我无法投票,因为我的声誉较低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2013-01-16
  • 2017-06-28
  • 1970-01-01
相关资源
最近更新 更多