Php 在MYSQL数据库中存储密码的最佳方法

Php 在MYSQL数据库中存储密码的最佳方法,php,Php,是的,我知道不建议以纯文本形式存储密码。是否有一种最好且简单的方法来存储密码,以便应用程序保持安全???哈希算法(如sha1和md5)不适合存储密码。它们的设计非常高效。这意味着暴力强迫的速度非常快。即使黑客获得了你的散列密码副本,也可以很快地对其进行暴力攻击。如果你使用盐,它会降低彩虹桌子的效果,但对暴力没有任何作用。使用较慢的算法会使暴力无效。例如,bcrypt算法可以按照您的意愿变慢(只需更改功因数),并且它在内部使用盐来防止彩虹表。如果我是你,我会采用这种方法或类似方法(例如,scryp

是的,我知道不建议以纯文本形式存储密码。是否有一种最好且简单的方法来存储密码,以便应用程序保持安全???

哈希算法(如sha1和md5)不适合存储密码。它们的设计非常高效。这意味着暴力强迫的速度非常快。即使黑客获得了你的散列密码副本,也可以很快地对其进行暴力攻击。如果你使用盐,它会降低彩虹桌子的效果,但对暴力没有任何作用。使用较慢的算法会使暴力无效。例如,bcrypt算法可以按照您的意愿变慢(只需更改功因数),并且它在内部使用盐来防止彩虹表。如果我是你,我会采用这种方法或类似方法(例如,scrypt或PBKDF2)。

首先,md5和sha1已被证明容易受到冲突攻击,并且可以很容易地被设置为彩虹表(当他们看到你在他们的通用密码数据库中的哈希是否相同时)

目前有两件事是足够安全的密码,你可以使用

第一个是sha512。sha512是SHA2的子版本。SHA2尚未被证明易受冲突攻击,sha512将生成512位哈希。下面是一个例子 如何使用sha512:

<?php
hash('sha512',$password);
salt通常是一个随机字符串,当您对密码进行哈希运算时,会将其添加到所有密码的末尾。使用salt意味着,如果有人获取了您的数据库,他们就无法检查哈希表中的常用密码。使用rainbow表调用检查数据库。你应该总是用盐当散列

以下是我对SHA1和MD5冲突攻击漏洞的证明:

数据库中的、


密码应加密存储。 建议使用单向加密(哈希),如SHA2、SHA2、WHIRLPOOL、bcrypt 已删除:MD5或SHA1。(这些人年龄较大,易受伤害

除此之外,您还可以使用其他每个用户生成的随机字符串-“salt”:

$salt = MD5($this->createSalt());

$Password = SHA2($postData['Password'] . $salt);
createSalt()
在本例中,是一个从随机字符生成字符串的函数

编辑:
或者,如果您想要更安全,您甚至可以添加2种盐: $salt1.$pass.$salt2

您可以采取的另一个安全措施是用户停用:在5次(或任何其他次数)不正确的登录尝试后,用户将被阻止x分钟(比如说15分钟)。
它应该最大限度地减少暴力攻击的成功。

为用户存储一个唯一的salt(例如,从用户名+电子邮件生成),并存储一个密码。登录时,从数据库获取salt并对salt+密码进行哈希。
使用bcrypt对密码进行哈希。

最好使用crypt将密码存储在数据库中

示例代码:

$crypted_pass = crypt($password);

//$pass_from_login is the user entered password
//$crypted_pass is the encryption
if(crypt($pass_from_login,$crypted_pass)) == $crypted_pass)
{
   echo("hello user!")
}
文件:


您应该使用单向加密(这是一种加密值的方法,因此很难反转)。我不熟悉MySQL,但快速搜索显示它有密码()函数。在数据库中,您将存储加密值,当用户想要验证您的身份时,使用他提供的密码,使用相同的算法/函数对其进行加密,然后检查该值是否与存储在该用户数据库中的密码相同。这假设浏览器和服务器之间的通信是安全的,即使用https。

我认为这与基本相同。使用加密哈希函数对密码进行哈希运算并存储。使用SHA-2或SHA-3。MD5仍然可以使用,但我建议继续使用其他2个。使用bcrypt,一种最先进的哈希函数特别为密码设计的g算法。对一个相关的问题显示了一种简单的实现方法。如果我错了,请纠正我,但SHA1和MD5在冲突预防方面是不正确的(找到2个产生相同哈希值的哈希函数输入),但仍然可以抵抗预映像攻击(给定一个哈希,找到一些哈希值为给定值的输入)。我认为只要我们正确地设置密码,就不必担心使用SHA1或MD5。我不是安全专家,所以我也可能是错的:SHA1和MD5非常快,因此即使使用salt,也会使暴力强制非常快。使用salt确实是一个好主意,因为它可以防止彩虹表,但具有关于暴力强制,它仍然是脆弱的。当使用较慢的算法时,暴力强制是不可行的,因为破解密码需要太长的时间。你可能认为它的计算速度更快是正确的,但我仍然怀疑,与MD5/SHA1相比,最新的加密算法的计算速度有多慢顺便说一句,为什么不自己阅读论文并评估一下呢?‎ - scryptCollision攻击的PHP实现意味着找到2个具有相同哈希的输入(并且受到生日悖论的影响)。这与此有任何关系吗?(因为这对攻击者来说更像是一种前映像攻击-当他们获得数据库转储时).crypt函数最多只能加密8个字符。加密helloworld和helloworldearth将返回相同的输出。否,MySQL
密码()
函数仅用于内部用途,不应依赖。MySQL中有哈希函数,但在SQL中进行哈希运算是个坏主意。密码很容易通过查询日志公开。您应该真正使用
bcrypt
-使用每秒可计算60亿次的加密哈希运算是不好的nd在用于密码存储的现代gfx卡上。“如果你想要更高的安全性,你甚至可以添加2个盐:$salt1。$pass。$salt2”这不会有什么伤害,但添加更多盐并不会带来安全收益。当然,盐的长度不应该太小,但在这种情况下,md5的128位就足够了()是的,但它更像是密码——如果您的密码中有1个大写字母,最好将其放在密码中间,而不是第一个/l
$salt = MD5($this->createSalt());

$Password = SHA2($postData['Password'] . $salt);
$crypted_pass = crypt($password);

//$pass_from_login is the user entered password
//$crypted_pass is the encryption
if(crypt($pass_from_login,$crypted_pass)) == $crypted_pass)
{
   echo("hello user!")
}