可能重复:
用户密码盐的最佳长度是多少?
我试图在Stack Overflow上找到这个问题的答案而没有任何成功.
假设我使用SHA-1哈希存储密码(所以它是160位),让我们假设SHA-1对我的应用程序来说足够了.用于生成密码哈希值的盐应该多长时间?
我找到的唯一答案是,使它比散列本身(在这种情况下为160位)更长,这听起来合乎逻辑,但我应该把它做多久吗?例如,Ubuntu使用带有SHA-512的8字节盐(我猜),因此对于SHA-1来说8个字节也足够了,或者它可能太多了?
我有两个盐,每个用户都有一个独特的盐,与数据库中的用户信息一起存储.第二种盐是网站特有的盐.两者都需要哈希密码.
问题是我不知道我应该在哪里保持我的网站盐.现在它驻留在运行散列算法的PHP方法中.我应该将它保存在/ var/www /之外的文件中并打开PHP并读取文件吗?我不想将它存储在数据库中,因为如果我的数据库受到损害,那将会破坏两种盐的目的.
有什么建议?
我试图理解Linux如何在etc/shadow文件上加密我们的密码,所以我没有新的虚拟"测试"用户进行一些测试:
user: newuser
密码: usrpw123
生成的盐: Ii4CGbr7
操作系统在etc/shadow文件中使用SHA512加密系统($ 6 $)使我成为以下行: newuser:$ 6 $ Ii4CGbr7 $ IOua8/oPV79Yp.BwzpxlSHjmCvRfTomZ.bhEvjZVxxxqvv82lZVrEtWQQej2pOWMdN7hvKwNgvCXKFQm5CB /:15069:0:99999:7 :::
现在,我从python中获取SHA512模块并试试这个:
import hashlib
m = hashlib.sha512()
m.update('Ii4CGbr7'+'usrpw123')
print m.hexdigest
Run Code Online (Sandbox Code Playgroud)
这给了我以下哈希作为结果: c73156daca3e31125ce457f1343201cc8a26400b2974440af2cc72687922b48b6631d21c186796ea2756ad987a996d2b261fe9ff3af4cc81e14c3029eac5df55
正如你所看到的,它与/ etc/shadow文件中的另一个不同,我不知道为什么我使用相同的salt +密码来生成哈希.
有人能帮我一把,或多或少解释一下为什么会这样吗?
而且,为什么/ etc/shadow文件生成带有一些点(.)的哈希?
谢谢
编辑:好的,所以我有点在这里找到答案BCrypt说长,类似的密码是等价的 - 问题与我,宝石,或密码学领域?
但是,如果你不得不在我们试图教育用户选择越来越复杂的密码,甚至密码,密码必须短于n个字符的世界中限制用户的密码长度,有人可以推荐使用bCrypt进行散列的新问题似乎是一种方式,最终在thedailywtf.com星期五的截图:)
原始问题如下:
我正在为一个应用程序重构一个旧的登录页面,并决定使用JAVA实现jBCrypt(http://www.mindrot.org/projects/jBCrypt/)给bCrypt一个旋转,并遇到一个主要的显示阻止.
问题在于checkpw方法,当使用非常长的种子时,它总是似乎返回true.我打算使用{InternalSalt} {username} {password}来填写用户的密码,然后使用bCrypt对其进行哈希处理.
所以我有以下代码(尽可能地将其剥离以隔离checkpw).
public class Test {
public static void main(String[] args) {
String plaintext = "jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKN";
String pw_hash = BCrypt.hashpw(plaintext, BCrypt.gensalt());
if (BCrypt.checkpw("jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKN", pw_hash))
System.out.println("It matches");
else
System.out.println("It does not match");
}
Run Code Online (Sandbox Code Playgroud)
}
这将是应该打印"匹配".
我有问题是说你说的添加AAA到密码传递给checkpw使它
BCrypt.checkpw("jw~ct/f61y1m7q458GiLVQpiqDK | 8kG = d368Id:D @ $ ^ _ 80I {qrn1HM6423 {FtestAccountO1nu3jKNaaa",pw_hash)
它仍然是真的!不完全是我所期待的.我没有在doc中看到任何密码长度限制但是我无法用较小的密码种子重现它,看起来如果我修改除了字符串结尾之外的其他任何东西,它按预期返回false.
我错过了什么专业吗?我知道我不应该是唯一一个在这些论坛上使用jBcrypt的人,因为我看过BCrypt在做一些研究时在很多帖子中推荐的.
编辑:Windows 7 64位 - Java(TM)SE运行时环境(版本1.6.0_24-b07)
我正在阅读有关如何安全地存储密码的相互矛盾的建议.我所知道的不是使用MD5!我见过人们主张使用PHP的bcrypt功能,这看起来好像它会占用服务器的处理器.我见过盐的倡导者,并主张不使用盐.
这一切都是如此不清楚.关于如何安全地存储密码,是否有真实可信的建议?
编辑:经过大量研究后,我发现了一篇文章;登录:深入讨论该主题:http://www.usenix.org/publications/login/2004-06/pdfs/alexander.pdf
假设我正在设计一个库,用SHA-256 HMAC签名/验证消息.如果最终用户使用弱共享密钥并发送大量短消息,我认为存在攻击者发现密钥的风险.
我的直觉说我应该在密钥上添加一个唯一的(每个消息)盐,以便对密钥进行逆向工程更难.
关键盐腌有多少帮助,我还能通过腌制消息获得任何收益吗?
我读的蛋糕3网站上的验证文件在这里,我仍然对如何我的用户密码迁移到我的新的应用程序略有困惑.
它说要包含FallbackPasswordHasher类,但如果是这种情况,我在哪里放置旧密码的盐(因为新网站不同)?除此之外,一切似乎都是不言自明的.
我有几个不同但相关的网站,我正在整合到一个网站,将在多个企业提供相同的服务,所以我需要从不同的网站导入用户的密码.
我很难理解bcrypt如何使用盐.我知道盐有什么用,但我不明白盐值是如何使用的.
问题1:正确的盐长度是多少?
我找到的所有资源都说,盐的长度为22,并且它与算法,成本和结果字符串中的实际哈希值一起存储.
但是,我发现的所有实现都使用长度为32的salt.例如,FOSUserBundle使用Symfony以下代码创建salt:
$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36)
Run Code Online (Sandbox Code Playgroud)
由于sha1散列是32个字符长,生成的盐也有32个长度.这只是一个懒惰的实现,跳过代码将字符串修剪为22的长度,因为这是由bcrypt它自己完成的吗?或者因某种原因需要32个字符?
问题 2:22的盐长度是否正确?
在下面的例子中,似乎只有盐的前21个字符保存在结果字符串中.将这21个字符作为salt传递password_hash将导致错误,但填充0将起作用:
$s = 'password';
$salt = 'salt5678901234567890123456789012';
$salt_prefix = 'salt567890123456789010'; // first 21 chars of salt + 0
$h1 = password_hash($s, PASSWORD_BCRYPT, array('salt' => $salt));
$h2 = password_hash($s, PASSWORD_BCRYPT, array('salt' => $salt_prefix));
echo $h1 . PHP_EOL;
echo $h2 . PHP_EOL;
//Result
$2y$10$salt56789012345678901uTWNlUnhu5K/xBrtKYTo7oDy8zMr/csu
$2y$10$salt56789012345678901uTWNlUnhu5K/xBrtKYTo7oDy8zMr/csu
Run Code Online (Sandbox Code Playgroud)
因此,需要将至少22个字符的盐传递给算法,但第22个字符似乎没用.那是对的吗?如果没有使用它,第22个字符的含义是什么?
问题3:为什么不手动指定盐?
在PHP函数password_hash中,不推荐使用手动哈希.相反,鼓励人们password_hash自动让,因为会更安全.
据我所知,对所有密码使用"弱"盐或相同的盐会导致彩虹表的风险.但为什么一般使用自动生成的盐会更安全?
为什么使用自动生成的盐而不是手动盐更安全,生成如下:
$this->salt = …Run Code Online (Sandbox Code Playgroud) 我想生成一个随机的salt值并将其置于Application状态.
现在,我正在使用Web场,因此每台计算机的应用程序状态将不同.我也不想购买分布式状态农场应用程序.
那么..有什么解决方案呢?我以为我可以在代码或web.config文件中对其进行硬编码..但这意味着eva的相同盐...不是很安全.
有人有什么建议吗?
记住 - 我在所有机器上都使用了一个独特的键(例如guid).也许配置文件是唯一的方法?
我使用crypt()来哈希密码,像这样的河豚盐:
[a-zA-Z0-9] $ 2a $,2位数,$,21个字符
在这里我犯了一个错误,在第三个$ 21之后的字符长度不是22.但它工作正常所以我没有找到错误.
它适用于运行Windows和PHP 5.4.4的桌面以及使用php 5.3.x运行Amazon linux的AWS ec2,其中包含太短的盐.
有一天,我将AWS php更新为5.5.14.然后问题发生了.crypt()一直返回*0.
经过一番尝试,我在盐的末尾加了一个$,所以它变成22个字符.它再次工作并返回与以前相同的哈希字符串.虽然它不遵守河豚规则,但字符应为[./a-zA-Z0-9]
但是现在我将这个站点复制到另一台运行openSuSE 13.1和php 5.5.14的机器上,这个盐再次失败了.
我将php降级到5.4.20,但没有帮助.
新站点仍然需要旧数据库,所以我必须使密码哈希工作.
什么是影响此河豚盐长度错误兼容性问题的库或模块?Tt似乎不是PHP的版本.AWS 5.5.14
或者是否有另一个神奇的咒语可以再次救我?我尝试在[./a-zA-Z0-9]中为每个替换尾部$但是没有幸运,哈希字符串是不同的....