由于Rainbow表的引入,并且仅使用散列密码(例如:MD5)来存储数据库中的密码并不是最好的安全方式.
当人们谈论盐渍哈希时,总是以这种方式使用它hash(password . salt)甚至是hash(hash(password) . salt).
我不知道为什么要使用salt,并为每个密码添加额外的条目来存储盐?为什么我们不使用hash(hash(password)),甚至hash(hash(hash(password)))?
放盐更安全吗?还是只是感觉更复杂?
可能重复:
PHP密码的安全散列和盐
这是加密密码以存储在mysql数据库中的安全方法:
md5(sha1($password))
Run Code Online (Sandbox Code Playgroud)
谢谢.
hash('sha512', $_POST['password'] . time())
Run Code Online (Sandbox Code Playgroud)
我听说过很多关于这个和那个的事情,并且无法得出结论......
我一直在做一些关于在数据库中安全存储密码的研究。通常建议您使用盐。正如Secure hash and salt for PHP passwords中的一个答案所解释的那样,这会更改哈希值,使密码更难以破解。
作为验证机制的一部分,用户输入的密码与盐结合并根据需要进行散列。鉴于盐对用户是透明的,使用盐如何提供任何额外的好处?
在我看来,无论有没有散列,相同的密码都将成功验证您的身份,因为使其与众不同的管道将在幕后进行。这就是为什么到目前为止我读过的文章都没有澄清事情的原因。
我有一个简单的注册脚本在PHP完成,我只是好奇,如果我这样做的方式足够安全,以存储用户密码.我正在生成一个32位随机盐并将其附加到sha1哈希密码.
//create new validator object
$validator = new data_validation();
//validate user input
$firstName = $validator->validate_fname($firstName); //is the first name a string?
$lastName = $validator->validate_lname($lastName); // is the last name a string?
$username = $validator->validate_username($username); // is the username a string?
$email = $validator->validate_email($email); //is the email in valid format?
//make sure there isn't duplicate emails
$valQuery = $link->query("SELECT email FROM users WHERE email = '" .$email. "'");
if ($valQuery->num_rows == 1) {
echo "An email is already registered with that …Run Code Online (Sandbox Code Playgroud) 我只是在阅读一篇关于创建登录系统的帖子,在阅读时我看到了密码散列。
我们将存储一个 sha256 哈希值,它是一个始终包含 64 个字符的字符串。
这篇文章正在教使用sha256哈希函数。读完之后,我并没有停下来,开始搜索更多关于创建安全登录系统的内容,然后我想出了wikiHow 的这篇文章。在本文中,他们使用sha512哈希函数。这让我很困惑,我将在下一个登录系统中使用哪个功能。我仍然在 google 上搜索更好的文章,并通过crackstation找到了这篇文章。作者推荐sha256和sha512。
只能使用加密散列函数来实现密码散列。SHA256、SHA512、RipeMD 和 WHIRLPOOL 等哈希函数是加密哈希函数。
我以为我的搜索已经结束,我可以使用sha256或sha512运行,但在搜索更多时,我发现了这个SO Question。罗伯特 K接受的答案对我来说有新的东西。关于我以前从未听说过的事情是bcrypt和scrypt。
所有这些东西都是大约 2 到 4 年前写的。
题
现在用于 PHP 的最佳密码散列算法是什么?
在将密码存储在MySQL数据库中之前,我使用以下方法对密码进行加密。
目前,我已将密码限制为最大长度。20个字符,因为我不确定较长的密码是否会由于加密输出而在此处引起问题。
在PHP中,我使用以下代码进行加密:
$pw = password_hash($_POST["pw"], PASSWORD_BCRYPT);
Run Code Online (Sandbox Code Playgroud)
密码在传递之前在客户端进行了修整。
有人可以告诉我是否 CHAR(60) 足以覆盖最多100个字符(数字,大写和小写字母,特殊字符)的密码吗?
另外,是否有一个共同的最大值。应为密码设置的字符限制-不会增加漏洞? 我了解到有些人肯定想使用更长的密码,例如短短语等。
我有一个网站使用SHA1哈希密码.我最近阅读了以下文章,该文章认为不使用SHA1作为密码,因为SHA1从未设计用于保护密码:http://arstechnica.com/security/2012/08/passwords-under-assault/4/
你能否推荐一个好的哈希方法,我可以实现而不是SHA1,请提供一个教程的链接,该教程逐步介绍如何使用php实现该加密方法?
这是我目前在PHP/SQL项目中的密码哈希程序...
hash('sha512', $password.$salt.$pepper, TRUE)散列和盐在DB中以二进制形式存储,主要是出于习惯.我认为它在安全方面没有任何区别.如果有的话,它对SQL备份来说稍微不方便,并使PHP代码看起来稍微复杂一些.
是hash()与SHA-256和SHA-512通常被认为已被bcrypt这些天superceeded?
我相信SHA-2(256/512)仍然被认为是加密安全的,我可能过度使用了熵位.与攻击者从数据库转储中反向设计SHA-2哈希相比,我的代码中的缺陷更有可能导致问题.
但是,我是否应该更新我的方法以继续使用crypt()CRYPT_BLOWFISH(我相信这被称为bcrypt,而blowfish在技术上是一种密码而不是哈希算法)?
即使只是作为未来的最佳实践?
我并不特别关心算法的计算费用(在合理范围内).这只是在您创建帐户,更改密码或在您进行哈希比较时登录时的一个因素.这些活动构成了一小部分页面浏览量.我想在某种程度上越慢越好,如果它使服务器更难以生成,那么它将使攻击者的工作更慢到暴力.
干杯,B
我一直在考虑升级我的一个应用程序的密码哈希安全性,因为我一直在阅读有关暴力攻击的速度比以前快得多.目前我正在使用sha1(md5($password)),我看到使用bcrypt + salt的好处.我的问题是,如果我要做以下事情会更安全吗?
场景1:
$password -> sha1 -> bcrypt -> sha1
// This would enable me to keep all existing passwords and just
// regenerate all the hashes without waiting for the user to re login
Run Code Online (Sandbox Code Playgroud)
场景2:
$password -> bcrypt -> sha1
// I would have to add an extra column for the new hash until every
// user has logged in but the hash will still be sha1.
Run Code Online (Sandbox Code Playgroud)
这两个中的任何一个都会增加哈希的安全性吗?我不是加密大师,远非它,我只想简单解释它是否会起作用,如果没有,为什么.
谢谢
编辑
经过一点阅读之后,似乎bcrypt受到青睐,因为它的缓慢使我在生成哈希之前使cpu/gpu工作的时间更长.
在sha1 vs bcrypt的情况下,sha1比bcrypt快大约300000倍.这引出了一个问题,如果bcrypts的优势很慢,那么使用sha1 300000次的递归散列函数肯定会像bcrypt一样安全吗?
我把这个函数作为一个例子: …