2011-07-27 226 views
4

我在解密文本文件的程序中使用OpenSSL,然后每次程序启动时都使用新文本和新加密密钥对其进行重新加密。我想在程序运行的实例之间安全地存储密钥。有没有一种简单/安全的方式来做到这一点?安全存储AES密钥

+0

您想要在两次独立执行之间存储密钥,还是希望在多个运行实例之间共享密钥? –

+0

两次独立执行之间。 – HighLife

+0

这是一个非常难以解决的问题,无需外部硬件,即使如此也需要很大的努力。 –

回答

3

如果你没有想到的是,应用程序安装在机器上的硬核攻击,你可以随时硬编码你的应用程序中,你会为了使用另一个加密密钥安全地保存在前一交易日AES关键关闭应用程序之前的文件系统,并在启动应用程序时将其恢复。你可以提高一点安全,如果:

  • 你不存储harcoded键成一个字符串,而是在几个字符串,然后你在一个函数

  • 你保存文件拼接在一个相对“不知名的”/不受欢迎的位置,如孤立存储或Windows \ Temp而不是应用程序文件夹

  • 您使用一个asimetric密钥算法(使裂纹更难..但在这种情况下..只是一点点)

  • 你把其他的东西(假的)在文件中不只是关键

+2

这就是我工作的公司(大银行)用于执行加密,使用每个应用程序发布的密钥加密密钥造成的严重混淆。这不像反思工程混淆的字节码那样容易。现在,我们使用PKI和HSM来存储密钥。 –

+1

默默无闻的安全性并不安全。您必须假设攻击者可以访问除键之外的所有内容。 –

+0

@JulieinAustin原则上同意;不要只依赖默默无闻。然而,默默无闻可以帮助很多,除非你保护的东西如此宝贵,以至于攻击者将毫不留情。另外,“误导”:如果你可以误导攻击者浪费大量时间来看待安全问题,那么你可能会阻止他们。这是“客厅背后隐藏的巨型保险箱,其中包含贵重物品,但不包含您的重要财务文件。” – ToolmakerSteve

1

如果你的程序是不是在安全区域(如果它的二进制代码进行检查,发现它会包含任何键或将它定义任何算法),有没有简单的方法:

  • 你可以以编程方式混淆密钥并将其存储在文件中,但在这种情况下,打破混淆算法就足以找到密钥。实际上,这会降低加密算法的强度。不是一个好的方式去。

  • 您也可以使用嵌入在程序中的静态密钥(称为B)来加密密钥(称为A here)本身,但在这种情况下,您将失去每次更改密钥A的兴趣。这是因为找到嵌入到程序中的密钥B足以找到保存在磁盘上的任何加密密钥A.这也不会令人满意。

考虑到更复杂的解决方案需要了解您的上下文多一点(攻击来自哪里,文件的生命周期是什么等)。但在这么远之前......是否需要走这么远?我的意思是:你的程序是否有破解企图的风险?如果它被破解,这是否是批评性的?如果不可破解或不重要,上面的第二个选项应该足够了。

1

如果目标主机有一个TPM芯片,你可以利用它的优势。 OpenSSL可以配置为使用TPM,借助trousers project