SHA1 vs md5与SHA256:哪个用于PHPlogin?
我正在做一个PHPlogin,我试图决定是否使用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);
都不是。 你应该使用bcrypt
。 你提到的哈希都是优化的,在硬件上是快速和容易的,所以破解他们共享相同的品质。 如果你没有别的select,至less一定要用长盐和重新散列多次。
在PHP 5.5+中使用bcrypt
PHP 5.5提供了密码散列的新function 。 这是现代Web应用程序中推荐的密码存储方法。
// Creating a hash $hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]); // If you omit the ['cost' => 12] part, it will default to 10 // Verifying the password against the stored hash if (password_verify($password, $hash)) { // Success! Log the user in here. }
如果您使用的是较旧版本的PHP ,则应该升级 ,但在使用之前,您可以使用password_compat来公开此API。
另外,请让password_hash()
为您生成盐。 它使用[CSPRNG](http://
两个bcrypt的警告
- Bcrypt将默默截断超过72个字符的任何密码。
- Bcrypt会在任何
NUL
字符后截断。
(这里有两个注意事项的概念certificate 。)
在使用bcrypt运行密码之前,您可能会试图通过预先对密码进行预处理来解决第一个警告,但是这样做可能会导致您的应用程序第二次运行。
不要编写自己的scheme,而应使用由安全专家编写和/或评估的现有库。
-
Zend\Crypt
(Zend框架的一部分)提供BcryptSha
-
PasswordLock
类似于BcryptSha
但它也使用经过validation的encryption库来encryptionbcrypt哈希。
TL; DR – 使用bcrypt 。
我认为使用md5或sha256或任何哈希优化的速度是非常好的,我很好奇听到其他用户可能有任何反弹。 这是我的原因
-
如果你允许用户使用弱密码,比如上帝,爱情,战争,和平,那么无论你使用何种密码,你仍然可以允许用户input密码而不是密码,这些密码通常是先使用的,与encryption有关。
-
如果你没有使用SSL或没有证书,那么听stream量的攻击者将能够拉取密码,并且任何使用JavaScript或类似方法进行encryption的尝试都是客户端,很容易破解和克服。 再次,这与服务器端的数据encryption没有任何关系。
-
蛮力攻击将利用弱密码,再次因为你允许用户input数据,如果你没有login限制3,甚至更多一点,那么问题将再次没有任何数据encryption。
-
如果你的数据库受到威胁,那么无论你做了多么神秘的事情,最有可能的事情都被攻破了,包括你的哈希技术。 再次,这可能是一个不满的员工XSS攻击或SQL注入或其他一些攻击,与您的密码encryption没有任何关系。
我相信你仍然应该encryption,但唯一能看到encryption的是防止那些已经拥有或以某种方式访问数据库的人从大声读出密码。 如果是某人未经授权的数据库,那么你有更大的问题担心,这就是为什么索尼拿走了,因为他们认为encryption的密码保护包括信用卡号码,所有的一切是保护一个领域就是它。
我可以看到,在数据库中对密码进行复杂encryption的唯一好处是能够延迟员工或其他访问数据库的人员读取密码。 所以,如果这是一个小项目,或者我不担心服务器端的安全问题,我会担心更多的是保护客户端可能发送给服务器的任何东西,比如sql注入,XSS攻击或者其他方式可能会受到影响。 如果有人不同意,我期待着从客户端读取超级encryption密码的方式。
我之所以想明确这一点,是因为人们经常认为encryption的密码意味着他们不必担心被盗用,他们不再担心网站的安全问题。
正如Johannes Gorset指出的那样, Matasano Security的Thomas Ptacek的post解释了为什么简单的通用散列函数(如MD5,SHA1,SHA256和SHA512)是糟糕的密码散列select 。
为什么? 它们速度太快了 – 你可以用一台现代计算机每核至less计算1,000,000次MD5哈希值,所以对于大多数人使用的密码来说,powershell是可行的。 这比基于GPU的破解服务器集群要less得多!
没有关键拉伸的腌制只意味着你不能预先计算彩虹表,你需要为特定的盐特别build立它。 但是这不会使事情变得更加困难。
用户@威尔说:
每个人都在谈论这个问题,就像他们可以通过互联网黑客攻击一样。 如前所述,限制尝试使得不可能通过互联网破解密码,而与散列无关。
他们不需要。 显然,在LinkedIn的情况下,他们使用常见的SQL注入漏洞获取login数据库表,并破解数百万密码的离线。
然后他回到离线攻击的情况:
当整个数据库受到攻击,黑客可以每秒对md5哈希执行1亿次密码尝试时,安全性真正起作用。 SHA512慢了大约一万倍。
不, SHA512比MD5慢10000倍 – 只需要两倍左右。 另一方面, Crypt / SHA512是一个非常不同的野兽,就像它的BCrypt对象一样,它执行关键的拉伸 ,产生一个非常不同的散列,内置随机盐,并且会花费500到999999倍之间的任何东西来计算(拉伸是可调的)。
SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21
所以PHP的select是Crypt / Blowfish(BCrypt),Crypt / SHA256或Crypt / SHA512。 或者至lessCrypt / MD5(PHK)。 见www.php.net/manual/en/function.crypt.php
使用SHA256
。 这是不完美的,因为SHA512
将是一个快速哈希的理想select,但出于select,它是一个明确的select。 根据任何散列技术,一定要加注散列以增加安全性。
另外请注意,FRKT,请告诉我哪里可以轻松破解一个SHA256哈希? 我真的很感兴趣,看到这一点。
重要编辑:
向前走,请使用bcrypt
作为一个强化散列。 更多信息可以在这里find 。
编辑在腌制:
使用随机数或随机字节stream等。您也可以使用数据库中logging的唯一字段作为盐,这样每个用户的盐就不同。
什么人似乎缺less的是,如果黑客有权访问数据库,他可能也有权访问密码的PHP文件,并可能只是修改,以发送给他所有成功的用户名密码组合。 如果他没有访问Web目录,他总是可以select一个密码来散列它,并将其写入数据库。 换句话说,哈希algorithm并不像系统安全那么重要,并且限制login尝试,如果你不使用SSL,那么攻击者就可以监听连接以获取信息。 除非您需要花费很长时间计算algorithm(出于您自己的目的), 否则使用用户特定的盐的SHA-256或SHA-512应该足够了。
作为一个额外的安全措施,build立一个脚本(bash,批处理,python等)或程序,并给它一个不起眼的名字,并检查,看看login.php是否已经改变(检查date/时间戳),并向您发送电子邮件如果有的话。 也应该logging所有尝试loginpipe理员权限,并logging所有失败的尝试login到数据库,并通过电子邮件发送给您的日志。
每个人都在谈论这个问题,就像他们可以通过互联网黑客攻击一样。 如前所述,限制尝试使得不可能通过互联网破解密码,而与散列无关。
盐是必须的,但复杂性或多种盐甚至不重要。 任何盐都阻止攻击者使用预制的彩虹桌。 每个用户独特的盐会阻止攻击者创build一个新的彩虹表,以对整个用户群使用。
当整个数据库受到攻击,黑客可以每秒对md5哈希执行1亿次密码尝试时,安全性真正起作用。 SHA512慢了大约一万倍。 一个复杂的密码与今天的力量可能还需要100年的时间才能使用md5,而使用SHA512将需要10000倍的时间。 这些盐并不能阻止暴力行为,因为他们总是要知道,如果攻击者下载了你的数据库,他可能已经在你的系统中了。
MD5,SHA1和SHA256是消息摘要, 而不是密码散列函数。
目前唯一的标准(如NIST认可的)密码散列或密钥派生函数是PBKDF2 。 其他合理的select,如果使用标准是不需要的,是bcrypt ,更新的scrypt和更新的氩气 。 维基百科有这些function的页面:
- 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不会提高build筑的安全性。 计算SHA256或SHA512散列速度非常快。 具有共同硬件的攻击者仍然可以每秒尝试数千万(单个CPU)甚至数十亿(具有单个GPU)的哈希值。 良好的密码散列函数包括减缓攻击者的工作因素。
以下是PHP程序员的一些build议:阅读PHP常见问题: 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
这里是MD5和SHA1的比较。 你可以清楚地知道哪一个更好。
由于碰撞问题MD5是坏的 – 两个不同的密码可能会产生相同的MD – 5。
沙1将是很多的安全。 您存储sha-1版本密码的原因是,swerver不会将用户的apassword保存在文件中,而是可能与其他人的服务器一起使用。 否则,它有什么不同?
如果黑客窃取了你的整个未encryption的数据库,那么哈希密码做的唯一的事情就是防止他冒充未来login的用户 – 黑客已经拥有了数据。
如果你的用户input的是一个简单的密码,攻击者有什么好的散列值?
而即使具有未来技术的黑客每秒钟可以产生一百万次sha-1密钥来进行蛮力攻击,你的服务器每秒钟处理一百万次login是否会让黑客testing密钥? 这就是说,如果让黑客尝试使用sal-sha-1而不是像正常login那样的密码login。
最好的办法是限制不良login尝试到一些合理的数字 – 例如25,然后计时用户一两分钟。 如果累计badylogin尝试在24小时内达到250,请closures帐户访问权限并发送给所有者。
让我们假设下一点:黑客窃取我们的数据库,包括用户和密码(encryption)。 黑客利用他们知道的密码创build了一个假账户。
由于MD5短而stream行,而且实际上每一个没有密码的散列代码都是字典攻击的弱点,因此MD5很脆弱。 但..
所以,假设我们仍在使用带有SALT的MD5。 黑客不知道SALT,但知道特定用户的密码。 所以他们可以testing:12345其中12345是知道密码和????? 是盐。 黑客迟早会猜测到SALT。
但是,如果我们使用了MD5 + SALT并且我们应用了MD5,那么就没有办法恢复这些信息。 不过,我再说一遍,MD5依然很短。
例如,假设我的密码是:12345.盐是BILLCLINTON
md5:827ccb0eea8a706c4c34a16891f84e7b
md5与哈希:56adb0f19ac0fb50194c312d49b15378
md5与散列在md5:28a03c0bc950decdd9ee362907d1798a我试图使用这些在线服务,我发现没有能够破解它。 而它唯一的MD5! (可能会像今天这将是易碎的,因为我生成在线MD5)
如果你想过度杀伤,那么SHA256如果使用盐和两次是绰绰有余。
tldr MD5(HASH + MD5(密码))=确定但短,SHA256绰绰有余。