3

Ok, so I need some advice on which encryption method I should use for my current project. All the questions about this subject on here are to do with networking and passing encrypted data from one machine to another.

A brief summary of how the system works is:

I have some data that is held in tables that are in text format. I then use a tool to parse this data and serialize it to a dat file. This works fine but I need to encrypt this data as it will be stored with the application in a public place. The data wont be sent anywhere it is simply read by the application. I just need it to be encrypted so that if it were to fall into the wrong hands, it would not be possible to read the data.

I am using the crypto++ library for my encryption and I have read that it can perform most types of encryption algorithms. I have noticed however that most algorithms use a public and private key to encrypt/decrypt the data. This would mean I would have to store the private key with the data which seems counter intuitive to me. Are there any ways that I can perform the encryption without storing a private key with the data?

4

5 回答 5

4

在您的情况下,我认为没有理由使用非对称加密。根据互联网访问的可用性,我看到了两个不错的解决方案:

  1. 将密钥存储在服务器上。只有当程序的用户登录到服务器时,他才能取回本地存储的密钥。
  2. 使用诸如 PBKDF2 之类的密钥派生函数从密码中派生密钥。

当然,如果攻击者有耐心并安装键盘记录器并等到您下次访问文件,所有这一切都会失败。一旦您的机器遭到入侵,就无法保护您的数据。

于 2011-07-12T09:01:41.343 回答
3

简短的回答:不要打扰。

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

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

于 2011-07-12T09:02:50.477 回答
2

解决您的问题的常用方法是:

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

无论如何,你应该检查

  • 对称密码与非对称密码
  • 签名与加密
  • 操作模式,这意味着您如何将一个块链接到下一个块密码,如 AES、3DES(CBC 与 ECB)

如前所述,如果您的数据被同一个应用程序读写,无论如何,都很难防止恶意用户窃取这些数据。有一些方法可以在代码中隐藏密钥(您可以搜索 Whitebox cryptography),但它肯定会相当复杂(并且显然不依赖于可以轻松模板化以窃取密钥的简单外部加密库)。

于 2011-07-12T09:43:15.237 回答
1

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

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

于 2011-07-12T09:02:06.630 回答
1

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

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

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

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

于 2011-07-12T09:02:18.060 回答