协议使用密码哈希与盐

时间:2011-06-08 02:55:07

标签: javascript hash salt message-digest

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

当用户登录时,在客户端输入用户名和密码。我想知道发送了什么信息。 Web客户端是否以纯文本形式发送了密码,或者是否使用javascript来散列密码而没有盐并发送了hased结果?或者客户端是否从服务器以纯文本方式获取salt,然后客户端发送了密码+ salt?

哈希和哈希哈希的最佳方法是什么? 哈希是否可以将MD5作为哈希? hash(password_plain_text + salt)与hash(hash(password_plain_text)+ salt)有何关系,其中+是字符串连接?

3 个答案:

答案 0 :(得分:6)

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

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

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

在任何一种情况下,您都应该始终哈希密码。原因是当密码越过线路(即在客户端和服务器之间)时不保留密码。原因是在您的数据库中保持密码安全 - 保守秘密最安全的方法是不要保密。

在客户端进行哈希处理根本不安全,因为它不仅暴露了您选择的哈希方法,还暴露了您的盐析机制(对于受损客户端,还暴露了实际的盐值。)

关于哈希的最佳方法...选择一个体面安全的哈希算法(一个SHA系列应该很好地完成这个技巧)和一个动态盐(每个用户不同的一个,例如加入的日期和他们的电子邮件地址的每隔一封信)。如果您想让它更安全,hash the hash a few (thousand) times。这样,即使您的整个数据库被盗,也需要花费大量的工作才能暴露一小部分密码,从而节省了重复使用密码的人员的麻烦。

答案 1 :(得分:3)

JavaScript会发送您要发送的任何内容。如果您没有通过JavaScript明确地散列密码,那么它们将以明文形式发送到正在散列它们的服务器。

但是,我不认为在客户端散列是一个好主意,因为这会向任何查看JavaScript的人透露你的盐。此外,未启用JavaScript的用户将无法登录。

服务器端的哈希。

至于安全性,它并没有什么区别。第二种解决方案使强盗黑客难以找到你的密码两倍(因为他们必须生成两个哈希而不是一个哈希),但只要没有人知道你的哈希,你就不必担心这个。 / p>

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

答案 2 :(得分:3)

如果您希望您的连接真正安全,请使用SSL。如果您的数据不重要,请在服务器上哈希密码。您可以在客户端上对其进行哈希处理,但无论如何您的哈希密码和盐都可能会受到损害,因此可以轻松获得密码。