我开始为我的网站创建一个用户系统,我想做的是加密密码,而不是明文。我使用PHP/MySQL,所以我认为crypt()是一个很好的起点。然而,我对这种密码学是全新的,我很难理解它到底是如何工作的。有人知道如何实现,在最简单的层面上,一种将密码存储为加密字符串的方法,但总是能够被解密,而不会出现安全问题?
crypt()
zf9nrax11#
密码应该是散列的,而不是加密的。也就是说,你不应该能够解密密码。相反,你应该比较散列。1.用户设置密码$password = 'hX4)1z'1.你得到密码的哈希值并存储到数据库:
$password = 'hX4)1z'
$pw = hash_hmac('sha512', 'salt' . $password, $_SERVER['site_key']); mysql_query('INSERT INTO passwords (pw) VALUES ('$pw');
字符串1.客户稍后回来。他们输入密码,然后你比较:
mysql_query('SELECT pw FROM passwords WHERE user_id = ?'); //$pw = fetch if ($pw == hash_hmac('sha512', 'salt' . $_REQUEST['password'], $_SERVER['site_key']) { echo "Logged in"; }
型
zpf6vheq2#
PHP有一些内置的函数,比如md5()。当我学习的时候,我发现IBM's primer非常有用-我强烈推荐你去看看。顺便说一句,我建议反对能够解密密码。唯一应该知道他们密码的人是用户!这就是为什么我们存储密码的散列版本,我们可以检查,而不是存储可以解密的加密密码。
dsf9zpds3#
我注意到人们在存储密码方面做了大量的交易。同意你不应该存储密码作为纯文本,但如果你存储的单向哈希和摆脱密码,黑客仍然可以使用算法来破解哈希哈希字符串和比较。此外,如果你用一个算法加密,你可以稍后解密,这也可以通过弄清楚加密算法被黑客攻击。我认为,只要没有人可以直接看到用户的密码,你只是让黑客很难,你很好,但人们说,你不应该加密,因为它可以被解密,但这是不公平的,因为任何东西都可以被黑客。
6mw9ycah4#
使用md5代替http://php.net/manual/en/function.md5.phphttp://en.wikipedia.org/wiki/Md5的
md5
qeeaahzv5#
您可以使用md5或更好的哈希技术,如sha1。有关详细信息,请参阅密码哈希http://phpsec.org/articles/2005/password-hashing.html。
uurity8g6#
我建议使用SHA2和盐来存储你的密码。要创建SHA2哈希,请使用以下命令:
$hash = hash("sha512", $password.$salt);
字符串salt包含一些额外的字符,可以在哈希之前添加到您的密码中,以防止彩虹表(密码和它的哈希数据库)。您可以使用唯一的用户信息(如user_id)创建一个salt,或者只是创建一个随机的并将其存储在某个地方。只要确保salt足够长。不要再使用MD5了,它太旧了。更多信息请访问http://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities。编辑:这些是单向哈希算法。你可以也不应该能够解密密码。如果你可以,那么使用哈希存储密码就没有意义了。
z9gpfhce7#
不,在您存储加密密码的位置方面始终存在安全问题。这就是为什么网站从不存储密码的哈希值,而不是密码本身。当有人在您的网站注册并输入密码时,您会存储哈希值(MD5或SHA1或其他,当他们稍后登录时,您再次对他们输入的密码进行散列(通过存储时使用的相同方法)并进行比较。如果哈希值相同,则密码相同(概率非常高!)任何让您恢复密码的网站都是不安全的网站。
7条答案
按热度按时间zf9nrax11#
密码应该是散列的,而不是加密的。也就是说,你不应该能够解密密码。相反,你应该比较散列。
1.用户设置密码
$password = 'hX4)1z'
1.你得到密码的哈希值并存储到数据库:
字符串
1.客户稍后回来。他们输入密码,然后你比较:
型
zpf6vheq2#
PHP有一些内置的函数,比如md5()。当我学习的时候,我发现IBM's primer非常有用-我强烈推荐你去看看。
顺便说一句,我建议反对能够解密密码。唯一应该知道他们密码的人是用户!这就是为什么我们存储密码的散列版本,我们可以检查,而不是存储可以解密的加密密码。
dsf9zpds3#
我注意到人们在存储密码方面做了大量的交易。
同意你不应该存储密码作为纯文本,但如果你存储的单向哈希和摆脱密码,黑客仍然可以使用算法来破解哈希哈希字符串和比较。
此外,如果你用一个算法加密,你可以稍后解密,这也可以通过弄清楚加密算法被黑客攻击。
我认为,只要没有人可以直接看到用户的密码,你只是让黑客很难,你很好,但人们说,你不应该加密,因为它可以被解密,但这是不公平的,因为任何东西都可以被黑客。
6mw9ycah4#
使用
md5
代替http://php.net/manual/en/function.md5.php
http://en.wikipedia.org/wiki/Md5的
qeeaahzv5#
您可以使用md5或更好的哈希技术,如sha1。有关详细信息,请参阅密码哈希http://phpsec.org/articles/2005/password-hashing.html。
uurity8g6#
我建议使用SHA2和盐来存储你的密码。
要创建SHA2哈希,请使用以下命令:
字符串
salt包含一些额外的字符,可以在哈希之前添加到您的密码中,以防止彩虹表(密码和它的哈希数据库)。您可以使用唯一的用户信息(如user_id)创建一个salt,或者只是创建一个随机的并将其存储在某个地方。只要确保salt足够长。
不要再使用MD5了,它太旧了。更多信息请访问http://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities。
编辑:这些是单向哈希算法。你可以也不应该能够解密密码。如果你可以,那么使用哈希存储密码就没有意义了。
z9gpfhce7#
不,在您存储加密密码的位置方面始终存在安全问题。这就是为什么网站从不存储密码的哈希值,而不是密码本身。当有人在您的网站注册并输入密码时,您会存储哈希值(MD5或SHA1或其他,当他们稍后登录时,您再次对他们输入的密码进行散列(通过存储时使用的相同方法)并进行比较。如果哈希值相同,则密码相同(概率非常高!)任何让您恢复密码的网站都是不安全的网站。