Javascript 使用salt进行密码哈希的协议

Javascript 使用salt进行密码哈希的协议,javascript,hash,salt,message-digest,Javascript,Hash,Salt,Message Digest,我试图了解在web应用程序中需要发送哪些信息。基本上,我有一个在web服务器上运行的web应用程序,一个数据库,它有一个用户表,其中包含哈希密码和salt,当然还有启用javascript的web客户端 当用户在登录时,在客户端输入用户名和密码。我想知道发送了什么信息。web客户端是以纯文本形式发送密码,还是使用javascript对密码进行无盐哈希处理并发送hased结果?或者客户端从服务器获取明文形式的salt,然后客户端发送hased密码+salt 什么是最好的炸土豆条,用盐炸土豆条? M

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

当用户在登录时,在客户端输入用户名和密码。我想知道发送了什么信息。web客户端是以纯文本形式发送密码,还是使用javascript对密码进行无盐哈希处理并发送hased结果?或者客户端从服务器获取明文形式的salt,然后客户端发送hased密码+salt

什么是最好的炸土豆条,用盐炸土豆条?
MD5可以作为散列吗?hash(密码纯文本+salt)和hash(密码纯文本)+salt)是如何比较的,其中+是一个字符串连接?

JavaScript发送您告诉它发送的任何内容。如果您没有通过JavaScript显式地对密码进行散列,那么它们将以明文形式发送到对密码进行散列的服务器

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

服务器端的散列

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


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

如果你想让你的连接真正安全,请使用SSL。如果您的数据不重要,请在服务器上散列您的密码。您可以在客户端对其进行散列,但您的散列密码和salt可能会被泄露,因此容易被破解。

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

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

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

在任何一种情况下,您都应该对存储的密码进行哈希运算。原因是在密码通过线路时(即在客户端和服务器之间)不保留密码。原因是要确保数据库中的密码安全——保守秘密的最安全的方法是没有密码

客户端的散列根本不安全,因为它不仅公开了您选择的散列方法,还公开了您的salt机制(对于受损的客户端,还公开了实际的salt值)


至于最好的散列方式。。。选择一个安全的散列算法(SHA家族中的一个应该能很好地实现这一点)和一个动态salt(对于每个用户来说都是不同的,比如加入日期和他们电子邮件地址的其他每个字母)。如果你想让它更安全。这样,即使您的整个数据库被盗,也需要花费大量的工作才能公开哪怕是一小部分密码,从而使重复使用密码的人免于一些严重的麻烦。

客户端哈希是一个额外的安全层(无论多么小),如果您使用不同的算法和salt,它是安全的。当然,使用存储在服务器上的salt对于客户端散列来说是不安全的。关于示例salt,对于客户端的基本散列来说这是可以的,但是对于服务器端散列,salt应该更长。通常建议与散列的输出长度相同(例如,sha512输出512字节或64字节,因此salt应为64字节)。如果您需要增加计算费用,则哈希运算会成千倍地增加用户的登录时间。您最好使用类似的算法。