4

我正在为加密应用程序设计一个程序和文件格式。当我需要对加密的方法/工作流程做出决定时,我发现了这一点。我无法决定使用一种方法而不是另一种方法的利弊。

以下是格式结构的概述:

------------------------------------------
| 文件签名 || 固定 | 平原 |
|----------------||----------|------------|
| 算法信息 || 固定 | 平原 |
|----------------||----------|------------|
| 种子 || 固定 | 加密 |
|----------------||----------|------------|
| 数据 || 变量 | 加密 |
|----------------||----------|------------|
| CRC || 固定 | 加密 |
------------------------------------------

最初,我打算将SHA-256用于 Hash 函数,将AES-256用于加密算法,但后来它可以配置,正如格式所暗示的那样。

创建加密容器的建议过程:

  1. 哈希(密码)=> 密钥传递
  2. 生成随机种子
  3. 密钥传递 XOR 种子 => 密钥种子
  4. 使用 Key-Pass 加密种子并存储加密的种子
  5. 使用密钥种子加密数据并存储加密数据
  6. 使用 Key-Seed 加密 CRC 并存储加密的 CRC

问题

A.存储加密的种子和 CRC 有什么好处吗?如果我不加密存储它们会不会更不安全?

B.使用 [ Hash(Password + Seed) ] 生成密钥而不是使用 [ Hash(Password) XOR Seed ] 作为最终密钥的安全性或多或少或没有区别?

C.以上两个问题的结论性问题。使用创建加密容器的替代过程是好还是坏:

  1. 哈希(密码 + 种子)=> 密钥
  2. 存储未加密的种子
  3. 使用密钥加密数据并存储加密数据
  4. 存储未加密的 CRC(或加密)

我想我必须存储未加密的种子,以便在读取加密内容时重新生成密钥。CRC 可以加密或不加密。

4

2 回答 2

3

构建自己的加密文件格式总是很困难(并且有风险)。

密钥生成 请使用PBKDF2 (PKCS #5 v2.0, RFC 2898 ) 生成您的密钥,而不是滚动您自己的密钥生成例程。这将要求您以未加密的格式存储盐(您称之为种子)。

CRC 存储 如果您已经处于使用加密的水平,请不要使用 CRC 进行完整性检查。您已经计划在其他地方使用 SHA256,也可以将其用于完整性检查。(我建议散列未加密的数据并存储未加密的散列,尽管您可以根据需要对其进行加密。)

于 2011-05-24T18:14:58.413 回答
0

如果你与种子进行 H(password) XOR,你需要加密存储种子,否则你会泄露哈希。如果你泄露了哈希,人们可以很容易地暴力破解它。这就是为什么在大多数协议(如 PBKDF2)上使用盐和多次迭代的原因。

您永远不应保存未加密的 CRC,因为 CRC 会提供有关加密容器中数据的信息。与 Eacwacer 建议的哈希相同。您最好使用 MAC(例如,也使用密钥生成器生成)。

当您要求特定答案时,我将在下面回答您的问题:

A:更好地存储它加密 B:H(密码|种子)更安全 C:很难说,XOR 是错误的,也是纯 CRC,但我仍然会选择第二个

对于未问的人:

D:请在上面加糖,使用众所周知的基于密码的加密算法,并使用加密安全的完整性检查方式

于 2011-05-24T18:24:00.800 回答