Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在系统(openssl,c)上安全地保存加密密钥?_C_Linux_Encryption_Openssl_Aes - Fatal编程技术网

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

如何在系统(openssl,c)上安全地保存加密密钥?,c,linux,encryption,openssl,aes,C,Linux,Encryption,Openssl,Aes,您好,我正在使用openssl evp api使用AES256CBC加密/解密文件 该文件使用密钥“k”和iv“v”进行加密(使用EVP\u BytesToKey()函数生成,其中我提供一个随机字节的数据作为salt,从RAND\u bytes()中获取)和用户提供的密码,然后使用这两个密码初始化加密上下文和解密上下文 初始化的功能是: int aes_init(unsigned char* pwd, unsigned int pwd_len,EVP_CIPHER_CTX *e_ctx, EVP

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

该文件使用密钥“k”iv“v”进行加密(使用
EVP\u BytesToKey()
函数生成,其中我提供一个随机字节的数据作为salt,从
RAND\u 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对文件A进行加密。程序正常退出 然后,如果用户现在想要解密加密文件A,他/她将需要相同的密码上下文,即相同的密钥k,相同的IV

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

注意:我已经看到一些商业加密产品为此创建了一种密钥库,不管它是如何实现的

这方面是否有一套指导方针

如有任何建议,将不胜感激


非常感谢

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

迟早会有人解锁密钥库。这需要密钥。您不能存储密钥库解锁密钥,因为需要在清除状态下检索密钥库以解锁密钥库。好的,您可以将密钥库解锁密钥存储在某个位置,但现在您又遇到了同样的问题


“标准”解决方案要求您依靠操作系统安全性使密钥库解锁密钥对除密钥库所有者或超级用户以外的任何用户都不可访问(假定为类UNIX系统)。

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

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


有关详细信息,请参见。

在屏幕上显示,请用户写下它,然后清除屏幕。下次,请用户键入密钥。或者,使用另一个密钥
k2
加密密钥
k
,并将其存储在磁盘上,然后将上述操作应用于
k2
。您可以安全地将IV存储在磁盘上。可以存储IV使用加密文件。它不需要保密。@KerrekSB但这对最终用户来说不是太多了吗(我正试图让它尽可能方便用户)@abhi:您只需硬编码几把密钥,让用户可以更简单地选择输入密钥号(1-5)@KerrekSB:然后坏人开始猜测密钥号。不太安全…你能建议我如何使用标准解决方案吗?你的意思是将其存储在文件中,并调整文件的文件权限,使其仅允许所有者访问它吗?正确。你将文件权限设置为密钥库所有者的只读权限。保留请记住,任何特权(“根”)用户和任何有权访问未加密备份的人都可以访问您的密钥库。只要这两个限制可以接受,您就可以了。另一种解决方案是将密钥库放置在可移动驱动器上,如USB拇指驱动器。只要密钥库存在于可移动驱动器上,应用程序就可以使用它。请删除thumb驱动器,没有更多的密钥库解锁密钥。谢谢你的建议。我计划创建一个受保护/隐藏的文件,并使用SHA1()进行pwd哈希。还有一件事,如果sha256()是用openssl(0.9.8k)实现的,你知道吗?大多数情况下,它们将私钥存储在用户只能访问的地方,并用PKCS#5(PBKDF2)加密。该密钥对的公钥用于加密“会话”"加密文件的密钥。文件本身通常在容器格式(如CMS或PGP指定的格式)内。当然,使用公钥/私钥需要PKI,这对于您的用例可能有点大。您最好使用PKCS#5中PBKDF2方法生成的密钥直接加密会话密钥。这可以当然,只有在您拥有密码派生密钥的情况下才能使用。@abhi:使用文件系统权限保护密钥是一个可行的解决方案。在我以前工作的领域——NSA级别的安全性——这不是一个可接受的解决方案,但对于低级别的安全性,以这种方式将密钥存储在文件中可能是一个可行的解决方案USB端口和thumb驱动器已经可用,如果您有一个环境,其中密钥可以存储在thumb驱动器上,并且只有在您需要时才会出现,这是另一种方式。因为听起来您使用的是类似UNIX的系统,我会考虑使用自动挂载功能,以便将thumb驱动器挂载到某个位置。非常感谢..我很高兴我将尝试将它与julie的建议结合起来并实现它。很多人感谢问题是,您仍然必须提供一个密钥来解密加密密钥。对于“我在哪里存储用于解密文档的密钥”的问题,没有解决方案这首先不涉及提供密钥。您可以按照此处的建议,在文档的开头提供密钥a的加密版本,但现在您又需要密钥来解密现在加密的密钥。但是,如果您提供加密密钥,您就进入了差分密码的域