我需要建立一个登录系统,并且基本上不知道它是如何完成的(考虑到安全性)我在互联网上研究它。我现在这样做的方式是这样的:
我的问题是:
答案 0 :(得分:2)
我想补充一些要点:
密码的散列在客户端上不完成。你不能可靠地做到这一点。计算哈希值的必要技术(在您的情况下为JavaScript)可能不可用,您不能相信结果。如果有人可以检索数据库中密码的哈希值,他可以在不知道实际密码的情况下登录。
确保使用SSL或其他安全传输将给定密码从客户端传输到服务器。毕竟SSL是一个好主意。
您不应使用单个哈希算法将密码存储在数据库中。看看HMAC。那要好得多。另外阅读加密中的盐。
答案 1 :(得分:2)
为什么散列密码会使系统更安全
哈希不等于加密。加密数据可以解密回纯文本。散列数据无法解密 通过散列用户的密码,没有人可以看到使用了什么密码。因此,如果您的数据被盗,黑客就无法对哈希进行解密。对于系统管理员来说也是如此,他/她无法“查找”密码。这可以是共享托管环境中的常见方案。
存储密码
确保密码存储方案安全的最简单方法是使用标准库。
因为安全性往往要复杂得多,并且比大多数程序员单独解决的问题更加隐形,所以使用标准库几乎总是最简单,最安全(如果不是唯一的)可用选项。
好消息是你不需要担心细节,这些细节是由有经验的人编制的,并且已经被互联网上的许多人评论过。
有关密码存储方案的更多信息,请阅读Jeff的博文:You're Probably Storing Passwords Incorrectly
无论你做什么,如果你去'我会自己做,谢谢'方法,不再使用
MD5
。这是一个很好的散列算法,但出于安全目的而被破坏。目前,使用crypt和CRYPT_BLOWFISH是最佳做法。
从我的回答:Help me make my password storage safe
至于臭名昭着的记住我选项。
创建随机令牌并以cookie的形式将其提供给用户。 如果用户使用此令牌提供cookie,则授予他们访问权限。关键是只接受每个令牌一次。因此,在使用它之后,将其替换为新的随机令牌。
这个令牌实质上只是另一个密码。因此,为了保证安全,您不要存储令牌,而是存储它的哈希值。 (就像你使用密码一样)
遗憾的是,您建议将Cookie绑定到IP地址不起作用。许多人拥有动态IP地址,有些甚至在单个会话期间从请求变为请求。 (例如,这是由负载平衡代理引起的。)
向服务器发送密码
当前可用于从Web浏览器向服务器发送密码的唯一方法是使用SSL加密连接。其他任何东西都不安全,因为您无法保证客户端解决方案的完整性。
答案 2 :(得分:0)