盐渍密码哈希

时间:2011-10-12 20:04:51

标签: authentication hash passwords salt

我正在尝试为Web应用程序创建一个登录系统,但我仍然坚持几点。我使用带有128位随机盐的sha2-512哈希将密码存储在我的数据库中。

但是我现在使用html表单以纯文本形式将密码发布到我的应用程序中,无论是在创建帐户时还是在用户登录时。我知道这是错误的。

我是否需要在客户端中散列密码?如果是这样,我如何考虑当前生成并存储在数据库中的盐?

注意:我这样做是为了学习不在生产系统中使用

4 个答案:

答案 0 :(得分:3)

最好的选择通常只是使用SSL。如果您确实需要在客户端进行哈希,那么我就是这样做的:

  1. 当您第一次存储密码时,请按照常用的方法使用存储的盐哈希密码。
  2. 当有人需要登录时,向他们发送储存的盐,以及随机生成的第二种盐。
  3. 客户端将使用存储的盐对明文密码进行哈希处理,然后使用随机盐哈希并将哈希值发送到服务器。
  4. 服务器将使用该请求salt中使用的随机值对存储的密码进行哈希并进行比较。
  5. 这是安全的,因为它确保传输的哈希对请求是唯一的(它使用单请求随机盐),因此以后只需再次发送哈希就不能伪造登录。向客户端发送存储的盐并不危险,因为假设密码破解者可以访问存储的盐(如果他们可以访问数据库)。需要两个哈希才能防止您将密码存储为纯文本。

答案 1 :(得分:2)

您应该使用SSL来传输加密的密码,以便中间人不能拦截数据包并读取正在发送的凭据。即使您在客户端预先散列密码,中间人仍可以使用该值伪造身份。

但真正让我担心的是使用SHA-512。很多人使用加密哈希来进行密码存储,但是流行的观点错过了一个非常重要的观点:这些哈希设计。也就是说,要成为SHA(或类似)哈希的要求之一就是能够在嵌入式硬件上快速散列大型文档。

这与您想要的密码存储完全相反,因为它允许高性能GPU上的专门例程以惊人和可怕的速度强制密码!

这就是为什么开发了一些专门构建的密码存储哈希的原因。我一直使用的是Bcrypt,它足够慢以防止暴力攻击,可调节以便在将来更快地连接硬件,并且还有为您处理盐腌的额外好处。

答案 2 :(得分:1)

在客户端上散列密码需要在客户端上使用salt。这也暴露了您的算法,以便在客户端非常容易地进行黑客攻击。最好的办法是通过SSL(HTTPS)执行此操作,以便整个事务被加密,并且只在服务器上进行身份验证。

即:您的用户ID和密码是从客户端加密传输的。 Web服务器对数据进行解密并将其传递给服务器端身份验证功能,您可以在其中查找用户和关联的salt,执行password + salt + hash并将其与存储的哈希进行比较以进行匹配。这意味着根本不需要从服务器传输散列和盐。

答案 3 :(得分:0)

您确实需要在要传输密码的任何页面上使用SSL。如果您尝试在客户端加密它们,它将使用javascript并且非常容易反向工作。