【问题标题】:protocol to use password hashing with salt使用盐进行密码散列的协议
【发布时间】:2011-06-08 02:55:06
【问题描述】:

我正在尝试了解需要在 Web 应用程序中发送哪些信息。基本上我有一个在网络服务器上运行的网络应用程序,一个数据库,其中有一个带有哈希密码和盐的用户表,当然还有启用了 javascript 的网络客户端。

当用户在 login 登录时,在客户端输入用户名和密码。我想知道发送了哪些信息。 Web客户端是否以纯文本形式发送密码,或者它是否使用javascript在没有盐的情况下对密码进行哈希处理并发送了hased结果?还是客户端从服务器获取纯文本的salt,然后客户端发送hased密码+salt?

散列和盐散列的最佳方法是什么? MD5 可以作为哈希吗? hash(password_plain_text + salt) vs. hash(hash(password_plain_text) + salt),其中+是字符串连接如何?

【问题讨论】:

    标签: javascript hash salt message-digest


    【解决方案1】:

    当浏览器发送您提供的数据时,它会以一种最有可能符合其与服务器通信协议的 RFC 要求的格式发送数据。

    在 HTTP 连接的情况下,用户名和密码以明文(即纯文本)形式发送到您的网络服务器。

    在 HTTPS 连接的情况下,客户端(在握手之后)发送到启用 HTTPS 的服务器的所有内容都被加密 - 一旦到达服务器,它就会被解密。无论您在服务器端使用什么软件堆栈,都应该为您透明地处理这个问题——因此您将再次以明文处理数据。

    在任何一种情况下,您都应该始终对您存储的密码进行哈希处理。原因是不要在密码通过网络时保留密码(即在客户端和服务器之间)。原因是在您的数据库中保持密码安全——最安全的保密方法是不要保留密码。

    客户端的散列根本不安全,因为它不仅暴露了您选择的哈希方法,而且还暴露了您的加盐机制(对于受感染的客户端,实际加盐值。)

    关于散列的最佳方式...选择一个相当安全的散列算法(SHA 系列中的一个应该可以很好地做到这一点)和一个动态盐(对于每个用户来说都是不同的,例如加入日期和他们的电子邮件地址的所有其他字母)。如果你想让它更安全,hash the hash a few (thousand) times。这样,即使您的整个数据库被盗,即使是一小部分密码也需要大量的工作才能暴露出来,从而为重复使用密码的人省去了一些严重的麻烦。

    【讨论】:

    • 客户端散列是一个额外的安全层(尽管很小)并且是安全的如果您使用不同的算法和盐。当然,使用存储在服务器上的 salt 对于客户端哈希来说是不安全的。
    • 关于您的示例 salt,对于客户端的基本哈希来说是可以的,但对于服务器端的哈希来说,salt 应该更长。通常建议与哈希的输出一样长(例如,sha512 输出 512 位或 64 字节,所以你的盐应该是 64 字节)。如果您需要增加计算费用,那么散列数千次会增加用户的登录时间。您最好使用bcrypt 或类似的算法。
    【解决方案2】:

    JavaScript 发送你告诉它发送的任何内容。如果您没有通过 JavaScript 明确地对密码进行哈希处理,那么它们会以明文形式发送到正在对其进行哈希处理的服务器。

    不过,我认为在客户端进行哈希处理并不是一个好主意,因为这会将你的盐暴露给任何查看你的 JavaScript 的人。此外,未启用 JavaScript 的用户将无法登录。

    在服务器端散列。

    至于安全性,它没有任何区别。第二种解决方案使暴力破解黑客找到您的密码的难度增加了一倍(因为他们必须生成两个哈希而不是一个),但只要没有人知道您的哈希,您就不必担心。

    但如果您真的担心安全性,请使用 SHA256 哈希。谷歌“md5 冲突”看看为什么 MD5 不是最好的散列函数(它是最快的之一)。

    【讨论】:

      【解决方案3】:

      如果您希望您的连接真正安全,请使用 SSL。如果您的数据不重要,请在服务器上散列您的密码。您可以在客户端上对其进行哈希处理,但您的哈希密码和盐可能无论如何都会被泄露,因此可以破解简单的密码。

      【讨论】:

        最近更新 更多