【问题标题】:If attacker has original data and encrypted data, can they determine the passphrase?如果攻击者有原始数据和加密数据,他们能确定密码吗?
【发布时间】:2010-04-06 18:04:35
【问题描述】:

如果攻击者拥有多个不同的项目(例如:电子邮件地址)并且知道每个项目的加密值,那么攻击者能否更轻松地确定用于加密这些项目的秘密密码?意思是,他们可以在不诉诸暴力的情况下确定密码吗?

这个问题可能听起来很奇怪,所以让我提供一个用例:

  1. 用户使用其电子邮件地址注册网站
  2. 服务器向该电子邮件地址发送一个确认 URL(例如:https://my.app.com/confirmEmailAddress/bill%40yahoo.com)
  3. 攻击者可以猜测确认 URL,因此可以使用其他人的电子邮件地址进行注册,并“确认”它,而无需登录该人的电子邮件帐户并查看确认 URL。这是个问题。
  4. 我们不会在 URL 中发送纯文本的电子邮件地址,而是使用密码短语加密发送。
  5. (我知道攻击者仍然可以拦截服务器发送的电子邮件,因为电子邮件是纯文本的,但请耐心等待。)
  6. 如果攻击者随后使用多个免费电子邮件帐户注册并看到多个 URL,每个 URL 都有相应的加密电子邮件地址,那么攻击者是否可以更轻松地确定用于加密的密码?

替代解决方案

我可以改为发送他们电子邮件地址的随机数或单向哈希(加上随机盐)。这消除了存储秘密密码,但这意味着我需要将该随机数/哈希存储在数据库中。上面的原始方法不需要存储在数据库中。

我倾向于使用单向哈希存储在数据库中,但我仍然想知道答案:拥有多个未加密的电子邮件地址及其加密的对应地址是否更容易确定使用的密码?

【问题讨论】:

  • 为什么不通过应用像 OpenId 这样的联合身份解决方案来解决您的整个问题?
  • 您的替代解决方案不需要额外的表,只需在现有表中增加一个已存储电子邮件地址的列
  • @Gareth 你是对的,我已经更新了这个问题。谢谢!

标签: encryption cryptography


【解决方案1】:

您所描述的是known-plaintext attack。经典密码非常容易受到此类攻击,但现代密码旨在抵御这种攻击。

您需要阅读一些关于加密的内容。

【讨论】:

    【解决方案2】:

    是的,它确实让事情变得更容易了。一般来说,攻击者拥有的信息越多,他们的工作就越容易。这个具体的例子叫做known-plaintext attack。

    【讨论】:

    • 但是对于一个设计良好的加密方法来说还是那么难,不成问题。
    • 现代密码不仅可以抵抗已知明文攻击,还可以抵抗自适应选择密文攻击。假设你的原语很弱而设计你的协议是一个大错误。选择受信任的原语。
    【解决方案3】:

    虽然您可以通过一些研究选择一种足够强大的加密方法来抵抗已知明文攻击,但仅仅避免在您的数据库中存储哈希值真的值得吗?

    使用单个密码来加密所有注册请求似乎是在添加一个不必要的单点漏洞:如果攻击者确实以某种方式破解了该密码,他们可以注册任意数量的帐户。另一方面,如果您为每个新帐户请求生成一次性哈希(例如电子邮件地址+随机数)来验证确认 URL,即使是拦截帐户 A 的确认电子邮件的黑客也不会更接近访问 B、C 或 D。

    您可能希望在数据库中存储有关确认过程的一些状态信息:确认 URL 的有效时间可能应该有时间限制。

    【讨论】:

    • 实际上,我认为由于“随机”哈希/秘密生成不佳而导致的漏洞至少与引入单个密钥的风险一样,如果不是更多的话。
    【解决方案4】:

    您需要的不是加密,而是身份验证。在您发送给客户的链接中,您不仅包括他们的电子邮件地址,还包括时间戳和所谓的 MAC,这是一个基于对称密钥的身份验证字段。 MAC 应该验证电子邮件地址和时间戳。 64 位 HMAC-SHA1 应该可以。当你收到链接时,检查时间戳是不是过去太远并且MAC验证;那么你知道你生成了链接。

    MAC 旨在抵御攻击者可以选择消息并请求相应 MAC 的攻击,因此您无需担心 MAC 相当于“已知明文攻击”。

    【讨论】:

      【解决方案5】:

      在一种情况下,答案是肯定的!!!那就是如果您使用流密码,例如 RC4。

      RC4 本质上是一个随机数生成器,它简单地将明文与从您的密钥派生的“密钥流”进行异或:

      P0 ^ K0 = C0
      P1 ^ K1 = C1
      P2 ^ K2 = C2
      .
      .
      PN ^ KN = CN

      如果你有明文和密文,你可以这样做:

      C0 ^ P0 = K0
      C1 ^ P1 = K1
      C2 ^ P2 = K2

      等等。如您所见,您获得了密钥流。不是key,而是key生成的流。

      【讨论】:

      • 哈哈,太好了!我更多地考虑三重 DES 或 AES 而不是 XOR,但感谢您的提示。
      • RC4 已损坏,不应使用。现代流密码将有两个参数,密钥和“nonce”。同一个密钥可以多次使用,只要没有随机数与特定密钥重复使用。即使您使用的是三重 DES 或 AES,这些也是分组密码;当您使用链接模式时,您可以有效地使用它们来构建流密码,因此同样需要考虑。一种流行的链接模式是 CTR 模式,它使用 XOR 将流与明文组合。所有安全链接模式都要求不重复使用 nonce,而不仅仅是 CTR。
      • “所有安全链接模式都要求不重复使用 nonce” - 这就是为什么 'nonce' == 'number once' :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多