4

嗨,我正在使用 openssl evp api 使用 AES256CBC 加密/解密文件。

该文件使用密钥'k'iv'v'加密(它们是使用EVP_BytesToKey()函数生成RAND_bytes()的并解密上下文。

初始化函数为:

int aes_init(unsigned char* pwd, unsigned int pwd_len,EVP_CIPHER_CTX *e_ctx, EVP_CIPHER_CTX *d_ctx)             /* return 0:SUCCESS 1: ERROR */
   {
    int i, rounds =5;                                       /* rounds */
    unsigned char key[32], iv[32], salt[8];

    if(!(RAND_bytes(salt,8))) //Writes cryptographically secure random bytes in salt[]
    {   
            perror("\n ERROR,SALT::");
            return 1;
    }   

    i = EVP_BytesToKey(EVP_aes_256_cbc(),EVP_sha1(),salt,pwd,pwd_len,rounds,key,iv);
   }

我打算实现的是这种情况:

用户使用密钥 k 和 IV v 加密文件 A。程序正常退出 那么如果现在用户现在想要解密加密的文件 A,他/她将需要相同的密码上下文,即相同的密钥 k,相同的 IV。

所以我的问题是如何安全地保存密钥和iv(用于加密的相同),以便以后可以使用它来解密文件。

注意: 我已经看到一些商业加密产品为此创建了一种密钥库,不知道它是如何完成的。

有没有为此遵循的任何指导方针?

任何建议将不胜感激..

非常感谢

4

3 回答 3

3

如果我正确理解你的问题,你不能。

迟早有人必须解锁密钥库。那需要一把钥匙。您无法存储密钥库解锁密钥,因为需要以明文方式检索它,以便可以解锁密钥库。好的,您可以将密钥库解锁密钥存储在某个地方,但现在您又遇到了同样的问题。

“标准”解决方案要求您依靠操作系统安全性来使除密钥库所有者或超级用户(假设是类 UNIX 系统)之外的任何用户都无法访问密钥库解锁密钥。

于 2012-05-06T17:43:05.293 回答
2

这些“解决方案”都不是真正安全的。如果要在系统上安全地存储对称密钥,则必须将其存储在硬件安全模块 (HSM) 中。一种相对便宜的选择是 Apricorn Aegis 加密闪存驱动器,它已通过 FIPS 140-2 3 级验证。

有关详细信息,请参阅http://www.apricorn.com/products/hardware-encrypted-drives/aegis-secure-key.html

于 2013-12-01T17:23:31.577 回答
1

存储密钥的另一种方法是要求用户输入密码。首先,您使用完全随机(会话)密钥加密文件。该密钥使用从密码派生的密钥进行加密,例如使用 PBKDF2 之类的函数(请参阅许多关于此的 stackoverflow 文章)。将加密的密钥与文件一起存储(可能在文件的前面,以便于解密,您也可以在加密文件之前加密和写入密钥)。

于 2012-05-07T22:22:26.077 回答