我正在进行php登录,我正在尝试决定是否使用SHA1或Md5,或者我在另一篇stackoverflow文章中读到的SHA256 . 他们中的任何一个比其他人更安全吗?对于SHA1 / 256,我还使用盐吗?
另外,这是一种将密码存储为mysql中的哈希的安全方法吗?
function createSalt()
{
$string = md5(uniqid(rand(), true));
return substr($string, 0, 3);
}
$salt = createSalt();
$hash = sha1($salt . $hash);
10 回答
让我们假设下一点:黑客窃取我们的数据库,包括用户和密码(加密) . 黑客用他们知道的密码创建了一个假帐户 .
MD5很弱,因为它短而流行且几乎每个没有密码的哈希生成都是字典攻击的弱点 . 但..
所以,假设我们仍在使用带有SALT的MD5 . 黑客不知道SALT,但他们知道特定用户的密码 . 所以他们可以测试:????? 12345其中12345是知道密码而且?????是盐 . 黑客迟早会猜到SALT .
但是,如果我们使用MD5 SALT并且我们应用了MD5,那么就无法恢复信息 . 但是,我再说一遍,MD5仍然很短 .
例如,假设我的密码是:12345 . SALT是BILLCLINTON
md5:827ccb0eea8a706c4c34a16891f84e7b
md5与哈希:56adb0f19ac0fb50194c312d49b15378
mD5与md5上的哈希值:28a03c0bc950decdd9ee362907d1798a我试图使用这些在线服务,我发现没有一个能够破解它 . 而它唯一的MD5! (可能就像今天一样,因为我在网上生成了md5)
如果你想要矫枉过正,那么如果使用盐和两次使用SHA256就足够了 .
tldr MD5(HASH+MD5(password)) = ok but short, SHA256 is more than enough.
这是MD5和SHA1之间的比较 . 您可以清楚地了解哪一个更好 .
MD5,SHA1和SHA256是消息摘要, not 密码散列函数 .
目前,唯一的标准(如NIST批准的)密码散列或密钥导出功能是PBKDF2 . 如果不使用标准,其他合理的选择是bcrypt,更新的scrypt和更新的argon2i . 维基百科有这些功能的页面:
http://en.wikipedia.org/wiki/PBKDF2
http://en.wikipedia.org/wiki/Bcrypt
http://en.wikipedia.org/wiki/Scrypt
https://en.wikipedia.org/wiki/Argon2
从MD5切换到SHA1或SHA512不会提高构造的安全性 . 计算SHA256或SHA512散列非常快 . 具有通用硬件的攻击者仍然可以尝试每秒数千万(使用单个CPU)甚至数十亿(使用单个GPU)的哈希值 . 良好的密码散列函数包括减慢攻击者速度的工作因素 .
以下是PHP程序员的一些建议:阅读PHP FAQ:http://php.net/manual/en/faq.passwords.php然后使用以下方法之一:
标准的PHP crypt()函数:http://fr.php.net/crypt:
PHPPASS:http://www.openwall.com/phpass/
PasswordHash:https://crackstation.net/hashing-security.htm
人们似乎缺少的是,如果黑客可以访问数据库,他可能还可以访问哈希密码的php文件,并且可能只是修改它以向他发送所有成功的用户名密码组合 . 如果他不像系统安全那么重要,并且如果你不使用SSL也限制登录尝试,那么攻击者可以只是监听连接以获取信息 . 除非你需要算法花费很长时间来计算(为了你自己的目的),否则_381520应该就够了 .
作为一个额外的安全措施,设置一个脚本(bash,batch,python等)或程序,并给它一个晦涩的名称,并检查并查看login.php是否已更改(检查日期/时间戳)并发送电子邮件如果有的话 . 还应该记录所有登录时使用管理员权限的尝试,并记录所有登录数据库的失败尝试并将日志通过电子邮件发送给您 .
每个人都在谈论这个,就像他们可以通过互联网被黑客攻击一样 . 如前所述,限制尝试使得无法通过Internet破解密码并且与散列无关 .
盐是必须的,但复杂性或多种盐甚至不重要 . 任何盐都可以阻止攻击者使用预制的彩虹桌 . 每个用户使用一个独特的盐可以阻止攻击者创建一个新的彩虹表,以用于整个用户群 .
当整个数据库遭到破坏时,安全性真正发挥作用,然后黑客可以针对md5哈希执行每秒1亿次密码尝试 . SHA512慢大约10,000倍 . 使用当前功能的复杂密码仍可能需要100年才能使用md5进行暴力破解,使用SHA512需要10,000倍的时间 . 盐根本不会停止暴力,因为它们总是必须知道,如果攻击者下载了你的数据库,他可能无论如何都在你的系统中 .
都不是 . 你应该使用
bcrypt
. 你提到的哈希都经过优化,可以快速轻松地在硬件上使用,因此破解它们具有相同的特性 . 如果您别无选择,至少要确保使用长盐并重新哈希多次 .在PHP 5.5中使用bcrypt
PHP 5.5提供new functions for password hashing . 这是现代Web应用程序中密码存储的推荐方法 .
如果您使用的是旧版本的PHP you really should upgrade,但在此之前,您可以使用password_compat来公开此API .
另外,请让
password_hash()
为您生成盐 . 它使用[CSPRNG](http://bcrypt的两个警告
Bcrypt将静默截断任何超过72个字符的密码 .
Bcrypt将在任何
NUL
字符后截断 .(Proof of Concept这里有两个警告 . )
您可能很想通过pre-hashing your passwords before running them through bcrypt解决第一个警告,但这样做会导致您的应用程序首先进入第二个 .
不要编写自己的方案,而是使用安全专家编写和/或评估的现有库 .
Zend\Crypt(Zend Framework的一部分)提供BcryptSha
PasswordLock与
BcryptSha
类似,但它也使用authenticated encryption library加密bcrypt哈希 .TL;DR - Use bcrypt .
由于碰撞问题,MD5很糟糕 - 两个不同的密码可能产生相同的md-5 .
Sha-1对此非常安全 . 存储salated sha-1版本密码的原因是,服务器不会将用户的密码保留在文件中,以至于他们可能正在与其他人的服务器一起使用 . 否则,它有什么不同?
如果黑客窃取了你的整个未加密的数据库的一些方法,那么散列密码密码的唯一方法就是阻止他冒充用户以备将来登录 - 黑客已经掌握了数据 .
如果您的用户输入的是普通密码,攻击者有什么好的散列值呢?
即使具有未来技术的黑客每秒可以产生一百万sha-1密钥用于暴力攻击,您的服务器是否会每秒处理一百万登录以供黑客测试他的密钥?如果你让黑客尝试使用salted sha-1而不是像普通登录这样的密码登录,那就是这样 .
最好的办法是将错误的登录尝试限制在某个合理的数字 - 例如25,然后将用户计时一两分钟 . 如果累积的bady登录尝试在24小时内达到250,则关闭帐户访问权限并通过电子邮件发送给所有者 .
正如Johannes Gorset指出的那样,the post by Thomas Ptacek from Matasano Security解释了为什么 simple, general-purpose hashing functions such as MD5, SHA1, SHA256 and SHA512 are poor password hashing choices .
为什么?它们太快了 - 你可以使用现代计算机计算每个核心每秒至少1,000,000个MD5哈希值,因此对人们使用的大多数密码都是可行的 . 这比基于GPU的破解服务器集群要少得多!
没有键拉伸的腌制只意味着您无法预先计算彩虹表,您需要特定地为该特定盐构建它 . 但它不会真的让事情变得更加艰难 .
用户@Will说:
他们不需要 . 显然,在the case of LinkedIn中,他们使用通用SQL injection vulnerability来获取登录数据库表并在线下破解了数百万个密码 .
然后他回到了离线攻击场景:
不, SHA512 不比MD5慢10000倍 - 它只需要两倍左右 . 另一方面, Crypt/SHA512 是一个非常不同的野兽,就像它的BCrypt对应物一样,执行key stretching,产生一个非常不同的哈希,内置一个随机盐,并且需要500到999999倍的计算量(拉伸是可调) .
因此,PHP的选择是Crypt / Blowfish(BCrypt),Crypt / SHA256或Crypt / SHA512 . 或者至少是Crypt / MD5(PHK) . 见www.php.net/manual/en/function.crypt.php
我认为使用md5或sha256或任何针对速度优化的哈希是完全正常的,我很好奇听到其他用户可能有的任何反驳 . 这是我的理由
如果您允许用户使用上帝,爱情,战争,和平等弱密码,那么无论加密如何,您仍然会允许用户输入密码而不是哈希,并且这些密码通常先使用,因此这是 NOT 将与加密有关 .
如果您没有使用SSL或没有证书,那么收听流量的攻击者将能够提取密码,任何使用javascript等进行加密的尝试都是客户端的,并且很容易破解和克服 . 这也是 NOT 与服务器端的数据加密有关 .
暴力攻击将利用弱密码并再次使用,因为如果您没有登录限制3或甚至更多一点,您允许用户输入数据,那么问题将再次 NOT 与数据加密有关 .
如果您的数据库受到损害,那么很可能一切都已被破坏包括你的哈希技术,无论你有多么神秘 . 同样,这可能是一个心怀不满的员工XSS攻击或SQL注入或其他与您的密码加密无关的攻击 .
我相信你应该仍然加密,但我唯一可以看到加密的做法是阻止已经拥有或以某种方式获得数据库访问权限的人只需大声读出密码 . 如果是未经授权访问数据库的人那么你就有更大的问题需要担心这就是索尼因为他们认为加密密码保护包括信用卡号码在内的所有信息而保留的原因所有这一切都是为了保护那个领域 .
我可以看到复杂的数据库密码加密的唯一好处是延迟员工或其他有权访问数据库的人只读取密码 . 所以,如果它是一个小项目或者其他什么我不会担心服务器端的安全性,而是我会担心更多关于保护客户端可能发送到服务器的任何内容,例如sql注入,XSS攻击或过多的其他方式你可能会受到损害 . 如果有人不同意,我期待着从客户端那里读取超级加密密码的方式 .
我之所以想要明确这一点,是因为人们常常认为加密密码意味着他们不必担心它会受到损害而且他们不再担心网站安全问题 .
使用
SHA256
. 它并不完美,因为SHA512
对于快速哈希来说是理想的,但是在选项之外,它是明确的选择 . 根据任何散列技术,请确保使用哈希值来增加安全性 .作为补充说明,FRKT,请告诉我哪里有人可以轻松破解盐渍SHA256哈希?我真的很有兴趣看到这个 .
重要编辑:
继续前进请使用
bcrypt
作为强化哈希 . 更多信息可以是found here .盐渍编辑:
使用随机数或随机字节流等 . 您也可以使用数据库中记录的唯一字段作为salt,这样每个用户的salt都不同 .