In letzter Zeit habe ich versucht, meine eigene Sicherheit für ein Anmeldeskript zu implementieren, das ich im Internet gefunden habe. Als ich versuchte, ein Skript zum Generieren eines Salts für jeden Benutzer zu lernen, bin ich auf password_hash
gestoßen.
Soweit ich weiß (basierend auf der Lektüre auf dieser Seite), wird das Salt bereits in der Zeile generiert, wenn Sie password_hash
verwenden. ist das echt?
Ich habe noch eine Frage: Ist es sinnvoll, zwei Salze zu verwenden? Einer wird direkt in der Datei und der andere in der Datenbank gespeichert? Wenn also jemand das Salt in der Datenbank bricht, haben Sie immer noch ein Salt in der Datei. Ich habe hier gelesen, dass es niemals eine kluge Idee ist, Salz aufzubewahren, aber es verwirrt mich immer, wenn Leute das sagen.
是的,你理解得没错,函数password_hash()会自动生成一个盐,并将其包含在生成的哈希值中。将盐存储在数据库中是完全正确的,即使已知,它也能发挥作用。
你提到的第二个盐(存储在文件中的盐),实际上是一个辣椒或服务器端密钥。如果在哈希之前添加它(就像盐一样),那么你就添加了一个辣椒。不过有一种更好的方法,你可以先计算哈希值,然后使用服务器端密钥对哈希值进行加密(双向加密)。这样你就可以在必要时更改密钥。
与盐不同,这个密钥应该保密。人们经常混淆并试图隐藏盐,但最好让盐发挥作用,并使用密钥添加秘密。
使用
password_hash
是存储密码的推荐方式。不要将它们分开存储在数据库和文件中。假设我们有以下输入:
首先通过以下方式对密码进行哈希处理:
然后查看输出结果:
如你所见,它已经被哈希处理了。(我假设你已经完成了这些步骤)。
现在将这个哈希密码存储在你的数据库中,确保你的密码列足够大以容纳哈希值(至少60个字符或更长)。当用户请求登录时,你可以通过以下方式检查数据库中的哈希值与密码输入是否匹配:
官方参考文档