我正在为加密应用程序设计过程和文件格式。当我需要就加密的方法/工作流程做出决定时,我找到了一个点。我无法决定使用一种方法而不是另一种方式的优点与缺点。
以下是格式结构的概述:
------------------------------------------ | File signature || fixed | plain | |----------------||----------|-----------| | Algorithm info || fixed | plain | |----------------||----------|-----------| | Seed || fixed | encrypted | |----------------||----------|-----------| | Data || variable | encrypted | |----------------||----------|-----------| | CRC || fixed | encrypted | ------------------------------------------
最初,我将使用 SHA-256 作为哈希函数,使用 AES-256 作为加密算法,但稍后它将可配置,作为格式建议。
创建加密容器的建议程序:
A。我是否从存储加密种子和CRC中获得了任何收益?如果我存储它们不加密会不那么安全?
B。使用[哈希(密码+种子)]进行密钥生成的安全性是否差异或没有差异,而不是为最终密钥设置[哈希(密码)XOR种子] ?
C。上述两个问题的结论性问题。使用替代程序创建加密容器会更好或更糟:
我想我必须存储未加密的种子,以便在读回加密内容时重新生成Key。 CRC可以加密或不加密。
答案 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:非常喜欢加糖,请使用众所周知的基于密码的加密算法,并使用加密安全的完整性检查方式