相关疑难解决方法(0)

如何在PHP中使用bcrypt进行散列密码?

我不时听到"使用bcrypt在PHP中存储密码,bcrypt规则"的建议.

但是什么bcrypt呢?PHP没有提供任何此类功能,维基百科关于文件加密实用程序的唠叨和Web搜索只是揭示了不同语言的Blowfish的一些实现.现在Blowfish也可以通过PHP获得mcrypt,但是如何帮助存储密码?Blowfish是一种通用密码,它有两种工作方式.如果它可以加密,则可以解密.密码需要单向散列函数.

解释是什么?

php passwords cryptography password-protection bcrypt

1230
推荐指数
9
解决办法
38万
查看次数

最佳实践:盐渍和胡椒密码?

我遇到了一个讨论,其中我了解到我一直在做的事情实际上并没有腌制密码而是给它们加油,而且我已经开始使用以下功能:

hash_function($salt.hash_function($pepper.$password)) [multiple iterations]
Run Code Online (Sandbox Code Playgroud)

忽略所选的哈希算法(我希望这是对盐和辣椒的讨论,而不是特定的算法,但我使用的是安全算法),这是一个安全的选择还是我应该做一些不同的事情?对于那些不熟悉这些条款的人:

  • 是通常存储与设计,使其不可能使用哈希表来破解密码的数据库中的字符串中的随机生成值.由于每个密码都有自己的盐,因此必须对它们进行单独的强制攻击才能破解它们; 但是,由于salt使用密码哈希存储在数据库中,因此数据库泄露意味着丢失两者.

  • 胡椒是从中旨在是秘密的数据库(在应用程序的源代码通常硬编码)分开存储站点范围静态值.它的使用是为了破坏数据库不会导致整个应用程序的密码表变得暴力破解.

有什么我缺少的,并且正在腌制和密封我的密码是保护用户安全的最佳选择吗?这样做有没有潜在的安全漏洞?

注意:为了讨论的目的,假设应用程序和数据库存储在不同的机器上,不共享密码等,因此违反数据库服务器并不会自动意味着破坏应用程序服务器.

security passwords hash salt password-hash

141
推荐指数
3
解决办法
4万
查看次数

PHP password_hash()password_verify()最大密码长度?

我可以使用PHP 5.5 password_hash()password_verify()?的最大密码长度是多少?

php security php-password-hash

6
推荐指数
1
解决办法
3617
查看次数

密码最大长度与bcrypt,河豚

我的问题来自于 如何使用河豚散列长密码(> 72个字符)

我使用bcrypt(河豚)来哈希密码.所以,正如我从这个问题中发现的那样 https://security.stackexchange.com/questions/39849/does-bcrypt-have-a-maximum-password-length

它的字符数限制为72.

所以,我开始考虑限制密码的最大长度,但是在这些问题及其答案之后

https://security.stackexchange.com/questions/33470/what-technical-reasons-are-there-to-have-low-maximum-password-lengths

为什么要限制密码的长度?

我应该在密码上加上最大长度吗?

所有人都说是反对的.提到的东西,比如

  • 节省存储空间
  • 旧的Unix系统经验
  • 与不支持长密码的旧系统交互
  • 公约(即"我们总是这样做")
  • 简单的天真或无知.
  • 以明文存储
  • 此外,a maximum length specified on a password field should be read as a SECURITY WARNING通过这个答案 - /sf/answers/6980711/
  • 等等

所以,我认为我不符合其中一个案例.当然,我同意愚蠢的限制,例如最大长度10,甚至更糟,8或6,但不是30,40或更长的密码(盐渍)被认为是安全的?从这篇文章(虽然有点旧),但它说

it can make only 71,000 guesses against Bcrypt per second
Run Code Online (Sandbox Code Playgroud)

http://arstechnica.com/security/2012/12/25-gpu-cluster-cracks-every-standard-windows-password-in-6-hours/

这适用于8个字符的密码.因此,我想象自定义彩虹表会蛮力一个30个或更多字符密码(考虑到每个密码都有自己的盐),因为彩虹表大小呈指数增长

引用同一篇文章的评论

每次在密码中添加一个字符时,都会以指数方式增加通过暴力破解所需的难度.例如,8-char密码的密钥空间为95 ^ 8组合,而20-char密码的密钥空间为95 ^ 20组合.

因此,对于一个20长度密码与bcrypt根据那将是必要95 ^ 20 /(71 000*3600*24*365)~10年28度(如果我做对了)

qsn1:现在,在这种情况下,使用blowfish有一个意思是不要将密码最大长度限制为72,因为在任何情况下都会被截断,因此这里没有额外的安全性增益.

qsn2:即使存在salt(每个用户都是唯一的并保存在db中),毕竟我想在密码中添加pepper(在应用程序中硬编码而不是保存在db中).我知道是否会增加一些额外的安全性,但我认为以防万一db(或db backup)只是泄露,胡椒将是有用的. https://security.stackexchange.com/a/3289/38200 所以,为了能够添加20个字符胡椒,我需要将密码最大长度设置为50左右.我想这样:让我们说用户是使用70个字符,在大多数情况下(如果不是全部),它将是一些短语或类似的,而不是生成强大的字符,因此将用户限制为50最大长度并添加另一个20-22更安全字符胡椒肯定更安全/随机.另外,让我们说黑客正在使用"常用短语"的彩虹表,我认为有更高的机会,这72 character common phrase将被黑客攻击,而不是50 character common phrase + 22 character …

encryption passwords password-policy password-storage password-encryption

6
推荐指数
1
解决办法
8194
查看次数

BCrypt说长,类似的密码是等价的 - 我,宝石或密码学领域的问题?

我一直在试验BCrypt,并发现了以下内容.如果重要的话,我正在运行ruby 1.9.2dev(2010-04-30 trunk 27557)[i686-linux]

require 'bcrypt' # bcrypt-ruby gem, version 2.1.2

@long_string_1 = 'f287ed6548e91475d06688b481ae8612fa060b2d402fdde8f79b7d0181d6a27d8feede46b833ecd9633b10824259ebac13b077efb7c24563fce0000670834215'
@long_string_2 = 'f6ebeea9b99bcae4340670360674482773a12fd5ef5e94c7db0a42800813d2587063b70660294736fded10217d80ce7d3b27c568a1237e2ca1fecbf40be5eab8'

def salted(string)
  @long_string_1 + string + @long_string_2
end

encrypted_password = BCrypt::Password.create(salted('password'), :cost => 10)
puts encrypted_password #=> $2a$10$kNMF/ku6VEAfLFEZKJ.ZC.zcMYUzvOQ6Dzi6ZX1UIVPUh5zr53yEu

password = BCrypt::Password.new(encrypted_password)

puts password.is_password?(salted('password')) #=> true
puts password.is_password?(salted('passward')) #=> true
puts password.is_password?(salted('75747373')) #=> true
puts password.is_password?(salted('passwor')) #=> false
Run Code Online (Sandbox Code Playgroud)

起初我认为一旦密码达到一定长度,所有散列中的差异就会丢失,只有当它们非常不相似(即不同的长度)时才会被识别为不同.从我所知的散列函数来看,这对我来说似乎不太合理,但我没有看到更好的解释.

然后,我尝试缩短每个long_strings以查看BCrypt开始能够区分它们的位置,并且我发现如果我将每个长字符串缩短到100个字符左右,最后的尝试('passwor')将开始也是如此.所以现在我不知道该怎么想.

对此有何解释?

ruby encryption passwords integer-overflow bcrypt

4
推荐指数
2
解决办法
1857
查看次数