Tag:

为什么crypt / blowfish与两种不同的盐产生相同的散列?

这个问题与PHP的crypt()的实现有关。 对于这个问题,盐的前7个字符不计算在内,所以盐' $2a$07$a '将被认为长度为1,因为盐只有1个字符,元数据有7个字符。 当使用超过22个字符的saltstring时,生成的哈希(即截断)没有变化,并且当使用less于21个字符的string时,salt将自动填充(显然为' $ '字符)。 这是相当简单的。 但是,如果给定一个盐20个字符和一个盐21个字符,除了21长度盐的最后一个字符,两个字符是相同的,那么两个哈希string将是相同的。 一个长22个字符的盐,除了最后一个字符,它和21长度的盐是一样的,哈希将会不同。 代码示例: $foo = 'bar'; $salt_xx = '$2a$07$'; $salt_19 = $salt_xx . 'b1b2ee48991281a439d'; $salt_20 = $salt_19 . 'a'; $salt_21 = $salt_20 . '2'; $salt_22 = $salt_21 . 'b'; var_dump( crypt($foo, $salt_19), crypt($foo, $salt_20), crypt($foo, $salt_21), crypt($foo, $salt_22) ); 会产生: string(60) "$2a$07$b1b2ee48991281a439d$$.dEUdhUoQXVqUieLTCp0cFVolhFcbuNi" string(60) "$2a$07$b1b2ee48991281a439da$.UxGYN739wLkV5PGoR1XA4EvNVPjwylG" string(60) "$2a$07$b1b2ee48991281a439da2.UxGYN739wLkV5PGoR1XA4EvNVPjwylG" string(60) […]

为什么盐会使字典攻击“不可能”?

可能重复: 需要一些帮助了解密码盐 更新:请注意,我不是问什么盐,什么彩虹桌,字典攻击是什么,或盐的目的是什么。 我在查询:如果你知道用户salt和hash,计算他们的密码不是很容易吗? 我理解这个过程,并在我的一些项目中自己实现。 s = random salt storedPassword = sha1(password + s) 在你存储的数据库中: username | hashed_password | salt 每一次我见过的盐都会在密码的末尾添加salt,或者开始: hashed_Password = sha1(s + password ) hashed_Password = sha1(password + s) 因此,一个值得他的盐的黑客的字典攻击(哈哈)将简单地运行每个关键字对存储的盐在上面列出的常见组合。 上面描述的实现只是为黑客添加了另一个步骤,而没有真正解决潜在的问题? 有什么替代方法来解决这个问题,或者我误解了这个问题? 我唯一能想到的就是有一个秘密的混合algorithm,它将salt和password绑定在一起,或者将其他用户字段添加到散列过程中,这意味着黑客必须有权访问数据库,他们的字典攻击certificate富有成效。 (更新,正如在评论中指出的那样,最好假定黑客可以访问你的所有信息,所以这可能不是最好的)。 让我举一个例子,说明我build议黑客会用密码和哈希列表破解用户数据库: 我们被黑客窃取的数据 RawPassword (not stored) | Hashed | Salt ——————————————————– letmein WEFLS… WEFOJFOFO… 常用密码字典: Common Password ————– letmein […]

yii CPasswordHelper:hashPassword和verifyPassword

我想我在这里错过了一些关键的东西。 在CPasswordHelper::hashPassword函数中,我们有行: $salt=self::generateSalt($cost); $hash=crypt($password,$salt); return $hash; 在CPasswordHelper::verifyPassword有这样一行: $test=crypt($password,$hash); return self::same($test, $hash); 那盐呢? 就我的理解,它甚至不存在,但它没有任何意义,所以我猜我完全不了解它。

bcrypt和随机产生的盐

所以我正在试验bcrypt。 我有一个类(下面显示,我从http://www.firedartstudios.com/articles/read/php-security-how-to-safely-store-your-passwords ),其中有3个function。 第一个是生成一个随机的Salt,第二个是使用第一个生成的Salt生成一个哈希值,最后一个是通过比较哈希密码来validation提供的密码。 <?php /* Bcrypt Example */ class bcrypt { private $rounds; public function __construct($rounds = 12) { if(CRYPT_BLOWFISH != 1) { throw new Exception("Bcrypt is not supported on this server, please see the following to learn more: http://php.net/crypt"); } $this->rounds = $rounds; } /* Gen Salt */ public function genSalt() { /* […]

你在哪里储存盐弦?

对数据库存储进行哈希密码处理时,我总是使用正确的per-entry saltstring。 为了我的需要,将散列密码旁边的salt存储在散列密码旁边一直工作正常。 但是,有些人build议将salt与数据库分开存放。 他们的观点是,如果数据库被攻破,攻击者仍然可以build立一个彩虹表,考虑一个特定的盐串,以便一次破解一个帐户。 如果这个帐号拥有pipe理员权限,那么他甚至不需要破解其他任何人。 从安全的angular度来看,将盐储存在不同的地方是值得的吗? 考虑在同一台机器上使用服务器代码和数据库的Web应用程序。 如果盐被存储在该机器上的平面文件中,那么很可能如果数据库受到损害,那么盐文件也是如此。 有没有推荐的解决scheme?

如何使用password_hash

最近我一直试图通过在互联网上偶然发现的login脚本来实现我自己的安全。 在努力学习如何让自己的脚本为每个用户生成盐之后,我偶然发现了password_hash。 根据我的理解(基于本页面上的阅读: http : //php.net/manual/en/faq.passwords.php ),当您使用password_hash时,salt已经在行中生成。 这是真的? 我的另一个问题是,有2盐是不是聪明? 一个直接在文件中,一个在数据库中? 那样,如果有人在数据库中泄漏了你的盐,那么你还是直接在文件中有一个? 我在这里读到,储存盐不是一个聪明的想法,但它总是让我困惑的人是什么意思。

腌制您的密码:最佳实践?

我一直很好奇…哪个更好的时候,哈希密码:前缀,或后缀? 为什么? 或者是否重要,只要你盐? 解释一下:我们(希望)现在知道我们应该在密码存储到数据库之前先encryption一个密码[ 编辑:所以你可以避免像最近发生的事情那样的事情 ]。 通常这是通过在将密码与哈希algorithm传递之前串接盐和密码来完成的。 但是这些例子各不相同…有些例子在密码之前加了盐。 一些例子在密码后添加盐。 我甚至见过一些尝试把盐放在中间。 那么更好的方法是什么?为什么? 有没有一种方法可以减less哈希碰撞的机会? 我的谷歌search没有就这个问题做出体面的分析。 编辑:伟大的答案乡亲们! 对不起,我只能select一个答案。 🙂

密码盐如何帮助防止彩虹桌袭击?

我在理解盐对密码的用途方面遇到了一些麻烦。 我的理解是,主要用途是阻止彩虹桌的攻击。 然而,我所看到的实现这些方法似乎并不能真正使问题变得更困难。 我看过很多教程,build议使用盐作为以下内容: $hash = md5($salt.$password) 原因是哈希现在不是映射到原始密码,而是密码和盐的组合。 但是要说$salt=foo和$password=bar和$hash=3858f62230ac3c915f300c664312c63f 。 现在有人用彩虹表可以颠倒散列,并提出input“foobar”。 然后他们可以尝试密码的所有组合(f,fo,foo,… oobar,obar,bar,ar,ar)。 获取密码可能需要几毫秒,但其他的不多。 我见过的其他用途是在我的linux系统上。 在/ etc / shadow中,散列密码实际上是与 salt一起存储的。 例如,“foo”的盐和“bar”的密码将哈希到: $1$foo$te5SBM.7C25fFDu6bIRbX1 。 如果黑客以某种方式能够得到这个文件,我不知道盐的用途是什么,因为te5SBM.7C25fFDu6bIRbX的反向散列已知包含“foo”。 感谢任何人都可以摆脱这一点。 编辑 :感谢您的帮助。 总结一下,我的理解是,盐使得哈希密码更加复杂,从而使其不太可能存在于预先计算好的彩虹表中。 之前我误解的是,我假设所有哈希表都存在彩虹表。

C#中的哈希和盐密码

我刚刚通过DavidHayden的哈希用户密码文章之一。 真的,我无法得到他想要达到的目标。 这是他的代码: private static string CreateSalt(int size) { //Generate a cryptographic random number. RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] buff = new byte[size]; rng.GetBytes(buff); // Return a Base64 string representation of the random number. return Convert.ToBase64String(buff); } private static string CreatePasswordHash(string pwd, string salt) { string saltAndPwd = String.Concat(pwd, salt); string hashedPwd = FormsAuthentication.HashPasswordForStoringInConfigFile( […]

如何安全地存储我的用户密码?

这比普通的MD5更安全吗? 我刚开始研究密码安全。 我很新的PHP。 $salt = 'csdnfgksdgojnmfnb'; $password = md5($salt.$_POST['password']); $result = mysql_query("SELECT id FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '$password'"); if (mysql_num_rows($result) < 1) { /* Access denied */ echo "The username or password you entered is incorrect."; } else { $_SESSION['id'] = mysql_result($result, 0, 'id'); #header("Location: ./"); echo "Hello $_SESSION[id]!"; }