【问题标题】:Encrypting a file from a password using libgcrypt使用 libgcrypt 从密码中加密文件
【发布时间】:2013-01-11 00:10:23
【问题描述】:

我正在开发对文件进行 aes256-cbc 加密的简单软件。我正在使用 GNU/Linux 和 libgcrypt-1.5.0。 IV 是使用 OpenSSL rand 函数随机生成的,IV 存储在输出文件中的密文之前。我正在使用 PKCS#7 填充方法。

现在我对如何进行有疑问:

  1. 最好使用sha256重复输入密码5万次加密文件,还是使用用户给的密码?

  2. 如果我想检查输入密码的正确性,我必须将它存储到加密文件中(显然是加密的)。这样做是否正确?

【问题讨论】:

标签: c cryptography openssl aes libgcrypt


【解决方案1】:
  1. 按照 indiv 的建议,使用 PBKDF2 派生密钥。
  2. 使用 PBKDF2 和不同的 salt 来派生身份验证密钥并将 MAC 附加到您的加密数据(加密后比加密前更安全)。验证MAC以检查密码是否正确,数据是否被篡改。如果您在选择 MAC 时不确定,请使用带有 SHA-512 的 HMAC(假设您根据您的问题使用 AES-256)。

您可以使用 PBKDF2 的单次调用来同时生成加密和身份验证密钥,而不是使用 PBKDF2 两次以不同的填充,方法是在一口气。

请注意,根据填充来决定密钥是否正确可能会导致 CBC 填充预言攻击。对于文件加密,此类攻击可能不适用,具体取决于具体情况,但无论如何使用适当的 MAC 进行数据身份验证似乎是一种谨慎的做法,因为您还希望防止位翻转攻击和其他对数据的恶意修改。

【讨论】:

  • 感谢大家的回答!所以加密文件的结构会是:IV(未加密)-密文-MAC(未加密),对吧?
  • 没错,您可以通过 IV 和密文计算 MAC,以防止篡改 IV 的攻击。
  • 您可以改为编辑 indiv 的答案。执行 PBKDF2 两次非常昂贵,您可以在输出上使用 KBKDF 函数(但这可能更难以实现)。
  • @owlstead 我不想破坏 indiv 之前对“2”的建议。与此同时,他将其与他删除的 cmets 一起编辑掉了。我同意你的另一点。
  • @polslinux 是的,这是最直接的实现方式。但是,您可以同时计算 K1 + K2,只需一个盐和一个对 gcry_kdf_derive 的调用,而是用 K1 和 K2 的组合长度计算 K3,然后将 K3 拆分为 K1 和 K2。
【解决方案2】:
  1. 这两种选择都不正确。您需要使用从密码中获取密钥的算法,例如PBKDF2。见函数gcry_kdf_derive

【讨论】:

    【解决方案3】:

    1.最好使用sha256重复输入密码50000次加密文件,还是使用用户给的密码?

    您永远不会将“原始”密码直接用作密钥。需要将密钥拉伸到针对蛮力攻击的加固中。查看字符串到密钥 (S2K) 的东西,或基于密码的密钥派生函数 (PBKDF),以及像 scrypt 这样的内存硬散列。


    2.如果我想检查输入密码的正确性,我必须将它存储到加密文件中(显然是加密的)。这样做是否正确?

    没有。您使用经过身份验证的加密模式,如 GCM。经过身份验证的加密模式是专门为任务构建的,并提供机密性和真实性。

    在密码下,加密文件将验证或不验证。不要担心自己的原因。否则,您将设置一个预言机,该预言机可能会撤消第 1 步中的所有内容(此处可能适用也可能不适用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2011-03-10
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多