使用密码和种子加密哪个过程更安全

时间:2011-05-24 15:26:11

标签: security encryption hash cryptography seed

我正在为加密应用程序设计过程和文件格式。当我需要就加密的方法/工作流程做出决定时,我找到了一个点。我无法决定使用一种方法而不是另一种方式的优点与缺点。

以下是格式结构的概述:

------------------------------------------
| File signature || fixed    | plain     |
|----------------||----------|-----------|
| Algorithm info || fixed    | plain     |
|----------------||----------|-----------|
| Seed           || fixed    | encrypted |
|----------------||----------|-----------|
| Data           || variable | encrypted |
|----------------||----------|-----------|
| CRC            || fixed    | encrypted |
------------------------------------------

最初,我将使用 SHA-256 作为哈希函数,使用 AES-256 作为加密算法,但稍后它将可配置,作为格式建议。

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

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

    A。我是否从存储加密种子和CRC中获得了任何收益?如果我存储它们不加密会不那么安全?

    B。使用[哈希(密码+种子)]进行密钥生成的安全性是否差异或没有差异,而不是为最终密钥设置[哈希(密码)XOR种子] ?

    C。上述两个问题的结论性问题。使用替代程序创建加密容器会更好或更糟:

    1. 哈希(密码+种子)=>键
    2. 存储未加密的种子
    3. 使用密钥加密数据并存储加密数据
    4. 存储未加密的CRC(或加密)
    5. 我想我必须存储未加密的种子,以便在读回加密内容时重新生成Key。 CRC可以加密或不加密。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

如果您使用种子进行H(密码)XOR,则需要将种子存储加密,否则您将放弃哈希值。如果你放弃哈希,人们可以轻易地强行它。这就是为什么在大多数协议(如PBKDF2)上使用salt和一些迭代的原因。

由于CRC提供有关加密容器内数据的信息,因此不应保存未加密的CRC。与Eacwacer建议的哈希相同。你最好使用MAC(例如也用密钥生成器生成)。

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

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

对于未经考虑的人:

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