使用libgcrypt从密码加密文件

时间:2013-01-27 15:11:27

标签: c cryptography openssl aes libgcrypt

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

现在我对如何继续存在疑问:

  1. 最好使用sha256重复输入50,000次密码加密文件,或者最好使用用户提供的密码?

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

3 个答案:

答案 0 :(得分:3)

  1. 两种选择都不正确。您需要使用为密码导出密钥的算法,例如PBKDF2。请参阅函数gcry_kdf_derive

答案 1 :(得分:3)

  1. 使用PBKDF2按照个人建议推导出一个密钥。
  2. 将PBKDF2与不同的盐一起使用以获取身份验证密钥并将MAC附加到加密数据(加密后比加密前更安全)。验证MAC以检查密码是否正确,以及数据是否未被篡改。如果您不确定何时选择MAC,请使用HMAC和SHA-512(假设您根据自己的问题使用AES-256)。
  3. 通过生成加密密钥和身份验证密钥的组合大小的密钥,您可以使用PBKDF2的单个调用来同时生成加密密钥和身份验证密钥,而不是使用PBKDF2两次使用不同的填充。一个人去。

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

答案 2 :(得分:0)

  

1.最好使用sha256重复输入50,000次密码来加密文件,或者最好使用用户提供的密码?

你永远不会使用" raw"密码直接作为密钥。关键是需要加强对强暴攻击的强硬态度。查看字符串到密钥(S2K)的内容,或基于密码的密钥派生函数(PBKDF)以及像scrypt这样的内存硬件哈希。


  

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

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

在密码下,加密文件将验证或不胜。不要担心自己的原因。否则,您正在设置一个oracle,它可以撤消步骤1中的所有内容(这可能适用也可能不适用)。