关于我应该使用的加密方法的建议

时间:2011-07-12 08:51:07

标签: c++ encryption crypto++

好的,所以我需要一些关于我应该为当前项目使用哪种加密方法的建议。此处有关此主题的所有问题都与网络连接以及将加密数据从一台机器传递到另一台机器有关。

系统如何运作的简要总结如下:

我有一些数据保存在文本格式的表中。然后,我使用工具来解析此数据并将其序列化为dat文件。这工作正常但我需要加密这些数据,因为它将与应用程序一起存储在公共场所。数据不会被应用程序简单读取的任何地方发送。我只是需要对它进行加密,这样如果落入坏人手中,就无法读取数据。

我使用crypto ++库进行加密,我读过它可以执行大多数类型的加密算法。然而,我注意到大多数算法使用公钥和私钥来加密/解密数据。这意味着我必须存储私钥,这些数据对我来说似乎很直观。有没有什么方法可以在不存储带有数据的私钥的情况下执行加密?

5 个答案:

答案 0 :(得分:4)

我认为没有理由在你的情况下使用非对称加密。我看到两种不错的解决方案,具体取决于互联网接入的可用性:

  1. 将密钥存储在服务器上。只有当程序的用户登录到服务器时,他才会将密钥返回到他的本地存储。
  2. 使用密钥派生功能(如PBKDF2)从密码中导出密钥。
  3. 当然,如果攻击者有耐心并且安装了键盘记录器并等到下次访问文件时所有这些都会失败。一旦机器遭到入侵,就无法保护您的数据。

答案 1 :(得分:3)

简短的回答:不要打扰。

答案很长:如果将.DAT文件与应用程序一起存储,则必须将密钥存储在某处。最有可能在同一个地方(可能隐藏在代码中)。因此,如果恶意用户想破坏您的加密,他所要做的就是寻找那个密钥,就是这样。使用哪种方法或算法并不重要。即使您没有将解密密钥与应用程序一起存储,它最终也会到达那里,并且恶意用户可以在运行时使用调试器捕获它(除非您使用专用的安全内存芯片并在设备上运行有必要的保护)

尽管如此,很多时候数据加密的事实足以保护,因为数据不值得麻烦。如果是这种情况 - 那么您可以将密钥嵌入代码中并使用任何可用的对称算法(AES将是最佳选择)。

答案 2 :(得分:2)

解决问题的常用方法是:

  • 使用symetric密钥算法来加密您的数据,常见的算法是AES,twofish。最有可能的是,你想使用CBC链接。
  • 使用摘要(sha-256)并使用您的私钥使用非对称算法(RSA)对其进行签名:这样您就可以嵌入签名和公钥来检查它,确保您的加扰密钥被泄露,其他人将无法伪造您的个人资料。当然,如果您需要更新这些数据,则无法使用此私钥机制。

无论如何,你应该检查

  • symetric cipher vs asymetric ones
  • 签名与加密
  • 操作模式,意味着如何将一个块链接到下一个块用于块密码,如AES,3DES(CBC与ECB)

如前所述,如果您的数据是由同一个应用程序读取和写入的,那么以任何方式阻止恶意用户窃取这些数据将非常困难。有一些方法可以隐藏代码中的密钥(你可以搜索Whitebox密码术),但它肯定会相当复杂(显然不依赖于一个简单的外部加密库,它可以很容易地模仿窃取密钥)。

答案 3 :(得分:1)

如果您的应用程序可以读取数据并且人们可以访问该应用程序,那么有足够动力和时间的人最终会(通过反汇编您的应用程序)弄清楚如何读取数据。

换句话说,解密加密数据所需的所有信息都已经在攻击者手中。您在所有与DRM相关的设计中都存在消费者=攻击者问题,这就是人们可以轻松解密DVD,蓝光,M4A,加密电子书等等的原因......

答案 4 :(得分:1)

当您使用公钥/私钥对时,这称为非对称加密。

您可以使用对称加密算法,这样您只需要一个密钥。

该密钥仍然需要存储在某个地方(它可能在可执行文件中)。但是如果用户可以访问.dat,他可能也可以访问exe。这意味着他仍然可以提取这些信息。但如果他可以访问电脑(以及所需的权利),他仍然可以从内存中读取所有信息。

您可以向用户询问密码(也称为密码)并使用它来对称加密。这样您就不需要在任何地方存储密码。