我正在尝试为Web应用程序创建一个登录系统,但我仍然坚持几点。我使用带有128位随机盐的sha2-512哈希将密码存储在我的数据库中。
但是我现在使用html表单以纯文本形式将密码发布到我的应用程序中,无论是在创建帐户时还是在用户登录时。我知道这是错误的。
我是否需要在客户端中散列密码?如果是这样,我如何考虑当前生成并存储在数据库中的盐?
注意:我这样做是为了学习不在生产系统中使用
答案 0 :(得分:3)
最好的选择通常只是使用SSL。如果您确实需要在客户端进行哈希,那么我就是这样做的:
这是安全的,因为它确保传输的哈希对请求是唯一的(它使用单请求随机盐),因此以后只需再次发送哈希就不能伪造登录。向客户端发送存储的盐并不危险,因为假设密码破解者可以访问存储的盐(如果他们可以访问数据库)。需要两个哈希才能防止您将密码存储为纯文本。
答案 1 :(得分:2)
您应该使用SSL来传输加密的密码,以便中间人不能拦截数据包并读取正在发送的凭据。即使您在客户端预先散列密码,中间人仍可以使用该值伪造身份。
但真正让我担心的是使用SHA-512。很多人使用加密哈希来进行密码存储,但是流行的观点错过了一个非常重要的观点:这些哈希设计是快。也就是说,要成为SHA(或类似)哈希的要求之一就是能够在嵌入式硬件上快速散列大型文档。
这与您想要的密码存储完全相反,因为它允许高性能GPU上的专门例程以惊人和可怕的速度强制密码!
这就是为什么开发了一些专门构建的密码存储哈希的原因。我一直使用的是Bcrypt,它足够慢以防止暴力攻击,可调节以便在将来更快地连接硬件,并且还有为您处理盐腌的额外好处。
答案 2 :(得分:1)
在客户端上散列密码需要在客户端上使用salt。这也暴露了您的算法,以便在客户端非常容易地进行黑客攻击。最好的办法是通过SSL(HTTPS)执行此操作,以便整个事务被加密,并且只在服务器上进行身份验证。
即:您的用户ID和密码是从客户端加密传输的。 Web服务器对数据进行解密并将其传递给服务器端身份验证功能,您可以在其中查找用户和关联的salt,执行password + salt + hash并将其与存储的哈希进行比较以进行匹配。这意味着根本不需要从服务器传输散列和盐。
答案 3 :(得分:0)
您确实需要在要传输密码的任何页面上使用SSL。如果您尝试在客户端加密它们,它将使用javascript并且非常容易反向工作。