3

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

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

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

4

3 回答 3

6

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

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

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

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

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

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

于 2011-06-08T03:10:59.813 回答
3

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

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

在服务器端散列。

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

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

于 2011-06-08T03:02:39.850 回答
3

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

于 2011-06-08T03:02:58.990 回答