相关疑难解决方法(0)

bcrypt如何内置盐?

Coda Hale的文章"如何安全地存储密码"声称:

bcrypt内置了盐来防止彩虹表攻击.

他引用了这篇论文,其中说在OpenBSD的实现中bcrypt:

OpenBSD从arcfour(arc4random(3))密钥流生成128位bcrypt salt,并使用内核从设备时序收集的随机数据进行种子处理.

我不明白这是如何工作的.在我的盐概念中:

  • 每个存储的密码需要不同,因此必须为每个密码表生成一个单独的彩虹表
  • 它需要存储在某个地方以便它是可重复的:当用户尝试登录时,我们会尝试密码,重复我们最初存储密码时所做的相同的盐和哈希过程,并进行比较

当我使用带有bcrypt的Devise(一个Rails登录管理器)时,数据库中没有salt列,所以我很困惑.如果盐是随机的并且没有存储在任何地方,我们如何可靠地重复散列过程?

简而言之,bcrypt如何内置盐

security hash internals bcrypt

570
推荐指数
4
解决办法
13万
查看次数

为什么我们使用"盐"来保护我们的密码?

我正在阅读本教程,我遇到了以下关于加密的讨论.最后写了

在最后一行中,我们使用密码对盐进行了哈希处理,产生了一个几乎无法破解的加密密码

但在我看来,一个拥有encrypted_passwordsalt可以做"彩虹"技巧的黑客就像我们使用的那样salt.

那么,我哪里错了?

谢谢!

$ rails console
>> require 'digest'
>> def secure_hash(string)
>>   Digest::SHA2.hexdigest(string)
>> end
=> nil
>> password = "secret"
=> "secret"
>> encrypted_password = secure_hash(password)
=> "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b"
>> submitted_password = "secret"
=> "secret"
>> encrypted_password == secure_hash(submitted_password)
=> true
Run Code Online (Sandbox Code Playgroud)

这里我们定义了一个名为secure_hash的函数,它使用一个名为SHA2的加密哈希函数,它是SHA系列哈希函数的一部分,我们通过摘要库将它们包含在Ruby中.7确切地知道这些哈希函数是如何工作的并不重要.为了我们的目的,重要的是它们是单向的:没有计算上易于理解的方法来发现它

2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b是字符串"secret"的SHA2哈希值.

但是,如果你考虑一下,我们仍然有一个问题:如果攻击者掌握了哈希密码,他仍然有机会发现原件.例如,他猜测我们使用了SHA2,因此编写一个程序来将给定的哈希与潜在密码的哈希值进行比较:

>> hash = "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b"
>> secure_hash("secede") == hash
=> false
>> secure_hash("second") == hash
=> false
>> secure_hash("secret") == hash
=> true
Run Code Online (Sandbox Code Playgroud)

所以我们的攻击者对任何密码为"secret"的用户都有一个匹配 - 坏消息.这种技术被称为彩虹攻击. …

encryption

19
推荐指数
2
解决办法
1万
查看次数

标签 统计

bcrypt ×1

encryption ×1

hash ×1

internals ×1

security ×1