如何在系统上安全地保存加密密钥(openssl,c)?

时间:2012-05-06 17:36:15

标签: c linux encryption openssl aes

您好我正在使用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(用于加密),以便我可以在以后使用它来解密文件。

注意: 我看到一些商业加密产品为此创建了一种密钥库,任何想法如何完成。

是否有针对此的指导方针?

任何建议都将受到高度赞赏..

非常感谢

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

存储密钥的另一种方法是询问用户密码。首先,使用完全随机(会话)密钥加密文件。该密钥使用从密码派生的密钥加密,例如密码。使用像PBKDF2这样的函数(参见关于此的许多stackoverflow文章)。将加密密钥存储在文件中(可能在文件前面,以便于解密,您也可以在加密文件之前加密和写入密钥)。