如何在解密数据之前检查密码

时间:2009-01-11 11:06:27

标签: c# .net security encryption

我正在创建一个需要以加密形式存储用户数据的程序。用户在加密前输入密码,并且需要再次提供密码以检索数据。如果有大量数据,解密需要一段时间。

现在,我想在进行解密之前检查用户是否输入了正确的密码。这种检查需要很快,而解密过程不是。

如何在实际完成解密过程之前检查密码?我考虑过将密码的哈希值存储为加密文件的前几个字节 - 这很容易也很快 - 但我不确定它是否会危及安全性?

我正在使用.NET和内置的加密类。

2 个答案:

答案 0 :(得分:7)

嗯,加密哈希不应该损害安全性,只要它是咸的并且具有合理的复杂性;但就个人而言,我可能会尝试设置它,以便数据损坏(由于密码不正确)很明显... ...

是否有可能定期在数据中注入校验和?或者,如果流表示记录,您是否可以使用迭代器(IEnumerable<T>等)读取它,以便它可以懒惰地读取并提前中断?

编辑)另外 - 在它可以判断密码是否正确之前强制它解密一小部分数据(但不是整个流)应该足以让它变得难以蛮力。如果它只需要处理前128个字节(或其他),可能足够快,使其值得尝试(字典等)。但是对于常规使用(一次尝试,密码是对还是错),它应该没有性能影响。

答案 1 :(得分:1)

我认为您使用密码作为加密/解密过程的盐。最简单的方法是加密某些标准短语,或者可以是用户提供的密码,其密码与加密过程的盐密码相同。当用户想要解密数据时,将该密码作为您的解密过程的盐,并使用ot来解密加密的密码。如果您收到密码,那么用户提供了正确的密码,您可以继续解密过程,否则通知用户他的密码不正确。

过程将是:

  • 用户给予密码和数据以获取结果。
  • 你用密码加密密码作为盐。并将其存储为ENCRYPTED_PASSWORD。
  • 使用PASSWORD加密DATA并存储它。

用户回来后会给你密码。

  • 您使用PASSWORD解密ENCRYPTED_PASSWORD为salt。
  • 如果结果等于PASSWORD,则解密DATA,否则通知用户。