[英]Secure PHP login against replay attacks
到目前为止,我一直在使用md5和sha1加密我的PHP登录中的密码,但由于这些算法现在被认为已经过时且不再安全,我想用PHP函数password_hash和password_verify构建一个新的登录系统。 但是,有一件事我无法找到这些功能的解决方案:为了使登录安全抵御重放攻击,仅仅为每个密码设置一个单独的盐是不够的。 因为如果攻击者以某种方式窃听客户端和服务器之间的通信,他就可以像原始客户端一样将用户名和已加密的密码哈希发送到服务器。 所以我的解决方案一直是创建一个额外的“盐”(我不知道是否有一个我的意思的官方术语),这仅对单次登录尝试有效。 因此,客户端从服务器获取两个盐(一个对于每个用户帐户始终相同,另一个每次不同),加密用户输入的密码并将散列发送到服务器。 然后服务器检查此哈希值(例如$ Hash == sha1($ HashFromDbWithFixedSalt。$ RandomHash))。 然后创建一个新的$ RandomHash。 因此,即使攻击者模仿用户的通信,他也无法获得不允许的访问权限。
新的PHP函数确实支持salt,但我找不到用这两种方法实现旧解决方案的方法,因为DB中的哈希将包含固定哈希(每个用户帐户不同)但不包含随机哈希(仅适用于一次尝试)。 有没有人有想法或者已经解决了这个问题?
编辑:
这就是我以前的做法:
新用户注册:
用户想要登录:
如果您没有使用SSL,那么您的登录将不安全。 无论您使用的哈希算法多么不可逆,无论如何都有其他方法来破坏交互。
它不是你的哈希的大小,它是你用它做的事情。 使用md5的编写良好的系统将比使用sha2的编写错误的系统更安全。
假设您已经使用SSL和HSTS预注册,以及一些可缓存的ssl-stripping-sensitive CSS但仍然需要更高的安全性,或者您在具有远程SSL终止的共享服务器上运行,那么您当前的方法是有效的,您只需需要升级您的散列算法(以及分配用于存储散列密码的空间)。 但正如您所发现的那样,在应用会话盐哈希之前,您仍然需要回复存储盐+密码哈希(提示:会话ID是后者的良好熵源,但JavaScript不能访问会话值 - 生成会话ID服务器端的has以用作会话salt)。 然后问题变成了JavaScript中可用的哈希函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.