Argon2id 的 PHP 实现为开发人员生成盐。应用程序如何跟踪该盐?作为开发人员,我如何考虑备份并确保我不会丢失盐?
所以我一直在阅读很多关于PHP加密的内容.这么多,我不确定什么是安全存储登录信息的真正好方法.
但是,我想出了以下功能:
function loginHash($username, $password){
$salt = str_split($password,(strlen($password)/2)+1);
$hash = hash('whirlpool', $username.$salt[0].'centerSalt'.$salt[1]);
return $hash;
}
Run Code Online (Sandbox Code Playgroud)
我是以正确的方式做到的吗?它用于验证与用户名相结合的密码,以及将生成的散列与存储在数据库中的散列进行比较以验证登录的能力.
我听说盐的唯一目的是防止彩虹表攻击,但肯定它必须比这更有价值?它不会阻止基于字典的攻击吗?那么暴力强迫,盐会在那里有用吗?你能解释一下原因吗?
其次,假设我有一个算法,它采用了微量的时间,一个128字符的盐和一个介于10亿到100亿之间的随机数,并将它们混合在一起.这会提供很高的安全性吗?因为即使攻击者知道其中一个细节,在我看来计算其余部分仍然在计算上是不可行的.那是对的吗?
谢谢,
本
编辑:为了澄清,攻击者无法访问哈希算法,因此他们不能向系统发送任何信息.它们只有散列,它们必须弄清楚它是如何编译的.当然,即使他们知道哈希是如何产生的,试图用长盐来强制所有组合也会让它变得不切实际?
此外,哈希不是用户的密码或用户名,它只是用于身份验证的随机字符集.因此,不需要存储salt和随机数,只需要存储结果.在这种情况下,上面的系统,如下面的代码所示,是一个很好的系统,以防止攻击者能够真实地猜测用户的哈希可能是什么?
$salt = "some random characters I made up";
hash('sha256', microtime(true).$salt.mt_rand(1000,9999));
Run Code Online (Sandbox Code Playgroud)
我知道只有1000-9999而不是上面提到的数十亿.
再次感谢.
如果我有一个随机的,16个字符长的字母数字盐(不同的情况),每个用户生成和存储,我是否还需要一个站点范围的盐?
换句话说,这样好吗?
sha1($user_salt . $password)
Run Code Online (Sandbox Code Playgroud)
我应该这样做吗?
sha1($user_salt . $password . $site_salt)
Run Code Online (Sandbox Code Playgroud)
也,
目前,我有一个加密的cookie,用于查找数据库中的会话.在此会话中,有一个user_id和一个user_token.然后我使用user_id查询数据库 - 如果DB === user_token中的user_id + hash的sha1,则允许用户通过.
我在每个页面加载时对user_id进行第二次查询,这样如果我删除,禁止或更改用户的密码,该操作立即生效.
这就是我在这里通过网站和问题查看的内容.你怎么看?我错过了什么?
我需要添加角色检查,但这可能会添加另一个查询(第3个仅用于auth).有小费吗?
我是Django框架中的新手.在django的默认身份验证系统中走动时,我发现django以algorithm$salt$hashed格式存储用户的密码.每个用户的盐并不相同; django为每个用户生成每个新盐.
我已经制作了几个网页并且有很多机会使用其他开源软件,但是总是只有一个用于散列的盐字符串.
所以,我的问题是:
可能重复:
盐的目的是什么?
我刚刚读了一些关于盐的使用的内容,我一直在阅读的例子给出了在散列之前为密码添加盐以防止字典攻击的问题.
但是,我真的没有看到它有多大帮助 - 如果攻击者可以访问密码的哈希值(就像我在阅读的例子中那样),他们很可能也可以访问盐.因此,在运行字典之前,攻击者是否只能将salt添加到字典中的每个项目之前并将其后置,以查看它是否与哈希匹配?所以他们不得不多次迭代字典,这似乎不是一个保护增强?
我想更新当前仅使用MD5的密码设置.
现在我想做的是使用更强大的东西(可能是sha256),每个用户使用独特的盐.
问题是关于盐储存.
我是否将盐存储在数据库中自己的列中?
然后哈希盐+密码,当涉及到登录时,从数据库中调用salt和密码,制作一个.
或者我是否通过使用用户名,电子邮件和时间戳来制作盐,这也会给每个用户带来独特的盐?
我想知道,如果有人拿着盐作为列的数据库,他们会知道每个用户的盐,然后他们可以破解密码.
在我开始之前,我知道MD5受到了损害(碰撞攻击和散列速度)并且不应该用于哈希密码,但只是为了它,请耐心等待.
我的问题是:使用md5进行散列时的盐位置如何影响散列的"质量"或"强度"?
假设我有以下代码,使用他的电子邮件地址的一部分作为salt哈希用户密码:
<?php
$email = 'user@emailservice.ex';
$password = 'RandomPassWithChars';
$segments = explode('@', $email);
list($saltPart1, $saltPart2, $saltPart3) = $segments;
$hash = md5($saltPart1.$password.$saltPart3.$saltPart2);
?>
Run Code Online (Sandbox Code Playgroud)
该代码是否会减慢蛮力/字典/彩虹表攻击,而不是说:
<?php
$password = 'RandomPass';
$salt = 'RandomSaltStoredInTheDatabase';
$hash = md5($password, $salt);
?>
Run Code Online (Sandbox Code Playgroud)
是否值得尝试像第一个代码中那样加密密码,或者它与第二个代码的结果相同?这有什么好处吗?第一个代码延迟破解密码列表是否比第二种方式更快?
这引出了第二个问题:在数据库中存储盐是否比从用户ID(例如电子邮件地址)获取盐更安全?我看到它的方式,一旦攻击者获得了数据库的副本,该数据库也保留了盐,这使他的生活变得有点轻松,试图破解哈希.但是如果没有储存盐,攻击者也需要创造盐的算法.如果我错了,请纠正我.
我希望我清楚自己.感谢您提前得到任何答案.
我试图了解密码盐如何提高安全性.基本上,对于每个用户密码,生成随机字符串,添加到密码然后进行散列.当用户登录时,系统为该特定用户获取salt,将其添加到密码,哈希并与存储的哈希值进行比较.
现在.我理解这是如何产生更长的密码/哈希值.我不明白是什么阻碍了自动化功能选择用户名,只是进行了大量的登录尝试 - 例如 - 一个网站,每次都有不同的密码.对我来说,似乎盐在那种情况下没有功能?
我确信我误解了这一点,如果有人能帮我理解,我会很高兴.
我对密码学很新,我BouncyCasetle API用来加密密码并将其存储在数据库中.对于加密我使用SHA-1算法,我想盐密码,以防止它再次字典攻击.
任何帮助,将不胜感激.
salt ×10
hash ×7
passwords ×5
php ×5
encryption ×3
bouncycastle ×1
cryptography ×1
django ×1
java ×1
md5 ×1
rainbowtable ×1
security ×1
session ×1