我正在为加密应用程序设计一个程序和文件格式。当我需要就加密的方法/工作流程做出决定时,我遇到了这样的情况。我无法决定使用一种方法相对于另一种方法的利弊。
以下是格式结构的概述:
------------------------------------------ | File signature || fixed | plain | |----------------||----------|-----------| | Algorithm info || fixed | plain | |----------------||----------|-----------| | Seed || fixed | encrypted | |----------------||----------|-----------| | Data || variable | encrypted | |----------------||----------|-----------| | CRC || fixed | encrypted | ------------------------------------------
最初,我将使用 SHA-256 作为哈希函数,使用 AES-256 作为加密算法,但稍后它将是可配置的,因为格式建议。
创建加密容器的建议程序:
- 哈希(密码)=> key 密码
- 生成随机种子
- key 传递异或种子 => key 种子
- 使用 key 密码加密种子并存储加密的种子
- 使用 key 种子加密数据并存储加密数据
- 使用 key 种子加密 CRC 并存储加密的 CRC
问题
A. 存储加密的种子和 CRC 能带来什么好处吗?如果我不加密存储它们,安全性会降低吗?
B. 使用 [ Hash(Password + Seed) ] 进行 key 生成与使用 [ Hash(Password) XOR Seed ] 作为最终 key 相比,在安全性上或多或少或没有区别?
C. 以上两个问题的结论性问题。使用替代过程创建加密容器是好是坏:
- 哈希(密码 + 种子)=> key
- 存储未加密的种子
- 使用 key 加密数据并存储加密数据
- 存储未加密的 CRC(或加密的)
我想我必须存储未加密的种子,以便在读回加密内容时重新生成 key 。 CRC 可以是加密的,也可以是未加密的。
最佳答案
构建您自己的加密文件格式总是很困难(并且有风险)。
key 生成 请使用PBKDF2,而不是滚动您自己的 key 生成例程。 (PKCS #5 v2.0, RFC 2898 ) 生成 key 。这将要求您以未加密的格式存储盐(您称之为种子)。
CRC 存储 如果您已经达到使用加密的水平,请不要使用 CRC 进行完整性检查。您已经计划在其他地方使用 SHA256,也可以将其用于完整性检查。 (我建议对未加密的数据进行哈希处理并以未加密的方式存储哈希值,尽管您可以根据需要对其进行加密。)
关于security - 使用密码和种子进行加密时哪种过程更安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6112867/