Tag: 哈希

密码哈希+盐如何工作

我虽然我理解哈希和腌制密码,但似乎我有一些误解。 我正在为nodejs中的我的网站创build一个用户帐户系统。 我理解的方式是,当用户创build一个密码时,我们生成一个随机salt,将其附加到密码,然后散列该string。 我们还可以添加一个工作因子,使哈希缓慢工作,并防范蛮力攻击。 我们将salt和散列一起存储在我们的数据库中,并validation一个login尝试,我们用储存的salt和密码尝试重复上述过程(在服务器上),并检查哈希是否匹配。 似乎nodejs中的bcrypt模块与我对散列的解释不一致。 这是来自http://codetheory.in/using-the-node-js-bcrypt-module-to-hash-and-safely-store-passwords/上的一个例子 var salt = bcrypt.genSaltSync(10); var hash = bcrypt.hashSync("my password", salt); 首先,为什么工作因素适用于盐而不是哈希? 如果有人用暴力攻击,他们会运行哈希函数是否正确? 哈希函数是不是我们需要慢一点? 我也对bcryptvalidation感到困惑: bcrypt.compareSync("my password", hash); 即使两个用户select相同的密码,我们也需要哈希值是独一无二的,这是否是盐点? 那么为什么我们不这样做呢? bcrypt.compareSync("my password"+salt, hash);

如何可靠地哈希JavaScript对象?

有没有一种可靠的方法来JSON.stringify一个JavaScript对象,保证所有的浏览器,node.js等ceated JSONstring是相同的,因为Javascript对象是相同的? 我想散列JS对象 { signed_data: object_to_sign, signature: md5(JSON.stringify(object_to_sign) + secret_code) } 并通过Web应用程序(例如Python和node.js)和用户传递它们,以便用户可以针对一个服务进行身份validation,并显示该服务的下一个服务“签名数据”以检查数据是否可信。 但是,我发现JSON.stringify在实现中并不是唯一的: 在node.js / V8中,JSON.stringify返回一个没有不必要空白的JSONstring,比如'{“user_id”:3}。 Python的simplejson.dumps留下一些空白,例如'{“user_id”:3}' 也许其他stringify实现可能会与空白,属性的顺序或任何其他方式不同。 有一个可靠的跨平台串化方法吗? 有没有“正规化的JSON”? 你会推荐其他的方法来散列这样的对象吗? 更新: 这是我用作解决方法: normalised_json_data = JSON.stringify(object_to_sign) { signed_data: normalised_json_data, signature: md5(normalised_json_data + secret_code) } 所以在这个方法中,不是对象本身,而是它的JSON表示(这是特定于信号平台)被签名。 这很好,因为我现在签名是一个明确的string,我可以轻松JSON.parse数据后,我已经检查了签名散列。 这里的缺点是,如果我将整个{signed_data,signature}对象作为JSON发送,我必须调用JSON.parse两次,看起来并不好,因为内部的一个会被转义: {"signature": "1c3763890298f5711c8b2ea4eb4c8833", "signed_data": "{\"user_id\":5}"}