分组密码SALT:明文或秘密?

时间:2009-10-19 21:41:35

标签: encryption cryptography

网上有很多文章和引言说“盐”必须保密。即使是Salt上的维基百科条目:

  

为了最好的安全性,盐值是   保密,分开   密码数据库。这提供了一个   数据库被盗时的优势,   但盐不是。确定一个   来自被盗哈希的密码,   攻击者不能简单地尝试共同   密码(例如英语   单词或名称)。相反,他们必须   计算随机的哈希值   字符(至少部分   他们所知道的输入是盐),   这要慢很多。

由于我碰巧知道加密盐(或初始化矢量)可以与加密文本一起存储在明文上,我想问为什么这种误解会持续存在

我的观点是,问题的根源是加密盐(分组密码的初始化向量)和散列“盐”之间的常见混淆。在存储散列密码时,通常的做法是添加一个nonce或'salt',并且(略微)确认这个'salt'更好地保密。这反过来使它根本不是一个盐,而是一个关键,类似于HMAC中明确命名的秘密。如果你看一下从维基百科'Salt'条目链接的文章Storing Passwords - done right!,你会发现这是在谈论这种'salt',即密码哈希。我碰巧不同意大多数这些方案,因为我认为密码存储方案也应该允许HTTP Digest authentication,在这种情况下唯一可能的存储是用户名的HA1摘要:realm:password,参见{{3 }}

如果您对此问题有意见,请在此处发帖作为回复。

  1. 你认为应该隐藏用于分组密码加密的盐吗?解释原因和如何
  2. 您是否同意全面陈​​述“盐应隐藏”来源于盐渍哈希并且不适用于加密?
  3. 我们可以在讨论中加入流密码(RC4)吗?

5 个答案:

答案 0 :(得分:4)

如果你在使用分组密码讨论IV,那肯定应该清楚。大多数人使用秘密IV使他们的密码变弱。

IV应该是随机的,每次加密都不同。管理随机IV是非常困难的,所以有些人只是使用固定的IV,打败IV的目的。

我曾经使用秘密固定IV加密密码的数据库。相同的密码始终加密为相同的密文。这很容易受到彩虹桌攻击。

答案 1 :(得分:4)

  

你认为盐是块   应该隐藏密码加密?   解释原因和方式

不,不应该。分组密码的强度依赖于密钥。 IMO你不应该通过添加额外的秘密来增加加密的强度。如果密码和密钥不够强,那么您需要更改密码或密钥长度,而不是开始保密其他数据位。安全性很难,所以保持简单。

答案 2 :(得分:0)

像LFSR咨询公司所说:

  

有些人更聪明   比你和我花了更多   时间考虑这个话题比   你或我永远都会。

至少可以说这是一个加载的答案。有些人,在诚实的范畴内,在资金到位时会忽略一些限制。有太多的人在火上没有皮肤,会降低这种类型的界限,....

然后,不远处,存在一种来自社会因素的风险 - 这几乎是不可能的。对于那个人来说,设置一个仅仅是为了“打破锁”的装置可以是一种纯粹的乐趣,没有任何收获或可衡量的理由。那就是说,你问那些有意见的人请回复:

  1. 你认为盐是块吗? 应该隐藏密码加密? 解释原因和方法。
  2. 以这种方式思考,它增加了所需的计算强度。如果必须隐藏它,还有一件事需要隐藏。由于它的自我,被迫隐藏(盐,静脉注射或任何东西)使执行安全的实体处于被迫做某事的位置。任何时候反对派都可以告诉你该怎么做,他们可以操纵你。如果它泄漏,应该已经检测到可用的泄漏和替代盐的交叉控制。没有完美的密码,除了otp,甚至可以以某种方式妥协,因为最大的风险来自内部。

    在我看来,唯一的解决方案是选择性地为您做出任何安全性 - 保护盐的问题会导致与威胁模型相关的问题。显然,密钥必须受到保护。如果你必须保护盐,你可能需要检查你的汉堡flippin简历,并质疑你工作的人的整体安全方法。

    实际上没有答案。

    1. 您是否同意全面陈​​述“盐应隐藏”来源于盐渍哈希并且不适用于加密?
    2. 谁说过这个,在哪里以及给出了什么基础。

      1. 我们是否应该在讨论中包含流密码(RC4)?
      2. 密码是一种密码 - 它会有什么不同?

答案 3 :(得分:0)

每记录盐的目的是使反转哈希的任务更加困难。因此,如果暴露了密码数据库,则会增加破解密码所需的工作量。因此,假设攻击者确切地知道您如何执行哈希,而不是为整个数据库构建单个彩虹表,他们需要为数据库中的每个条目执行此操作。

每记录盐通常是记录中字段的某些组合,这些字段在记录之间变化很大。交易时间,账号,交易号都是可以在每个记录盐中使用的字段的好例子。记录盐应该来自记录中的其他字段。所以是的,这不是秘密,但你应该避免公开计算方法。

数据库范围的盐存在单独的问题。这是一种关键,并使用现有的彩虹表来破解密码,以防止攻击者。数据库范围的盐应该单独存储,以便在数据库被泄露时,攻击者也不太可能获得此值。

应该将数据库范围的盐视为密钥,并且应该适度保护对salt值的访问。这样做的一种方法是将盐分成在不同域中管理的组件。代码中的一个组件,一个在配置文件中,一个在数据库中。只有正在运行的代码应该能够读取所有这些并使用位宽XOR将它们组合在一起。

最后一个领域是许多失败的地方。必须有一种方法来改变这些盐值和/或算法。如果发生安全事故,我们可能希望能够轻松更改盐值。数据库应该有一个salt版本字段,代码将使用该版本来识别要使用的盐和组合。加密或哈希创建始终使用最新的salt算法,但解码验证功能始终使用记录中指定的算法。这样,低优先级线程可以通过数据库读取解密和重新加密条目。

答案 4 :(得分:0)

每个加密块是下一个块IV。所以根据定义,IV不能保密。每个块都是IV。

第一个街区差别不大。知道纯文本长度的攻击者可能会暗示第一个块是IV。

  • BLOCK1可以使用众所周知的IV进行IV或加密
  • BLOCK2使用BLOCK#1加密为IV
  • ...
  • BLOCK N用BLOCK#N-1作为IV
  • 加密

但是,只要有可能,我会生成一个随机(非空)IV并将其提供给带外的每一方。但安全性增益可能并不那么重要。