-1

现在,这就是我正在做的: 1. SHA-1 密码,如“pass123”,使用密钥的十六进制解码的前 32 个字符 2. 使用 AES-256 加密,只要默认参数是 ^Is够安全吗?

我需要我的应用程序使用密码安全地加密数据。当我在谷歌上搜索时,会出现太多不同的事情,还有一些我也不了解的事情。我将此作为一般性问题提出,而不是任何特定的编码语言(尽管我计划将其与 Java 和 iOS 一起使用)。

因此,现在我正在尝试更正确地执行此操作,请遵循我的想法:

  1. 输入是密码,例如“pass123”,数据是我要加密的数据,例如“银行账户是038414838,密码是5931”

  2. 使用 PBKDF2 从密码中派生密钥。参数:1000 次迭代长度 256 位 Salt - 这个让我很困惑,因为我不知道从哪里得到盐,我只是弥补一个吗?例如,我所有的加密都将始终使用盐“F”(因为显然盐是 8 位,这只是一个字符)

  3. 现在我拿这把钥匙,我要散列它吗?我应该使用 SHA-256 之类的东西吗?那安全吗?什么是 HMAC?我应该用那个吗?注意:我是否需要同时执行第 2 步和第 3 步,还是只需要其中一个即可?

  4. 好的,现在我有 256 位密钥来进行加密。所以我使用 AES 执行加密,但这里还有另一个令人困惑的部分(参数)。我不太确定要使用哪些不同的“模式”,显然有像 CBC 和 EBC 之类的其他一些我也不确定“初始化向量”,我是否只是编造一个并总是使用那个? 那么其他选项呢,什么是PKCS7Padding?

4

1 回答 1

1

对于您的初始点:

  1. 使用十六进制显然会将密钥大小分成两半。基本上,您使用的是 AES-128 安全性。并不是说这很糟糕,但您也可以选择 AES-128 并使用 16 个字节。
  2. SHA-1 对于密钥派生相对安全,但由于彩虹表的存在/创建,不应该直接使用它。为此,您需要一个像 PBKDF2 这样的函数,它使用迭代计数和盐。

至于解决方案:

  1. 如果可以避免,您不应该加密 PIN。请确保您的密码足够安全,允许使用密码短语。
  2. 为每个密码创建一个随机数,并使用 PBKDF2 的输出保存 salt(16 个字节)。盐不一定是秘密的,尽管您可能希望包含系统秘密以增加一些额外的安全性。盐和密码经过哈希处理,因此它们可以具有任何长度以与 PBKDF2 兼容。
  3. 不,您只需保存 PBKDF2 生成的秘密,让 PBKDF2 在需要时生成更多数据。
  4. 永远不要使用 ECB(不是 EBC)。至少使用 CBC。请注意,CBC 加密不提供完整性检查(有人可能会更改密文,而您可能永远不知道)或真实性。为此,您可能需要添加额外的 MAC、HMAC 或使用 GCM 等加密模式。PKCS7Padding(在大多数情况下与 PKCS5Padding 相同)是一种添加虚假数据以获得 N * [blocksize] 字节的简单方法,这是按块加密所需的。

不要忘记在密文中添加(随机)IV,以防您重复使用加密密钥。IV 类似于盐,但应该是 [blocksize] 字节(AES 为 16)。

于 2012-02-23T19:42:03.540 回答