security - 使用密码和种子进行加密时哪种过程更安全

标签 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. 哈希(密码)=> key 密码
  2. 生成随机种子
  3. key 传递异或种子 => key 种子
  4. 使用 key 密码加密种子并存储加密的种子
  5. 使用 key 种子加密数据并存储加密数据
  6. 使用 key 种子加密 CRC 并存储加密的 CRC

问题

A. 存储加密的种子和 CRC 能带来什么好处吗?如果我不加密存储它们,安全性会降低吗?

B. 使用 [ Hash(Password + Seed) ] 进行 key 生成与使用 [ Hash(Password) XOR Seed ] 作为最终 key 相比,在安全性上或多或少或没有区别?

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

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

我想我必须存储未加密的种子,以便在读回加密内容时重新生成 key 。 CRC 可以是加密的,也可以是未加密的。

最佳答案

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

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

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

关于security - 使用密码和种子进行加密时哪种过程更安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6112867/

相关文章:

android - 如何确保文件从手机传输到服务器而不被篡改?

ajax - 如何安全地检查用户名是否已被占用?

php - "Javascript"能否解密由 PHP 加密的数据?

sql - 这是什么样的密码哈希/加密?

php - 通过 $_GET 激活帐户的正确方法是什么?

asp.net - 加密网络场中的 web.config

encryption - 蛮力解密攻击如何知道何时找到了正确的解决方案?

md5 - 将整个哈希范围拆分为 n 个相等的范围

arrays - 将散列视为数组?

java - 来自不同网址时的不同登录