PBKDF2WithHmacSHA512比.PBKDF2WithHmacSHA1

DTs*_*DTs 23 java pbkdf2 secret-key javax.crypto

我正在研究一个Java身份验证子系统,该子系统规定在DB中存储密码作为PBKDF2生成的哈希,我现在正在尝试决定是否应该使用SHA1SHA512作为PFR.我仔细检查了两者的规格,但我们在数学上非常密集地跟随它.有更好的加密理解的人可以解释一下有什么PBKDF2WithHmacSHA512不同PBKDF2WithHmacSHA1吗?

这是我正在尝试做的事情:

private static final int HASH_BYTE_SIZE = 64; // 512 bits
private static final int PBKDF2_ITERATIONS = 1000;      

// generate random salt
SecureRandom random = new SecureRandom();
byte salt[] = new byte[SALT_BYTE_SIZE]; // use salt size at least as long as hash
random.nextBytes(salt);

// generate Hash
PBEKeySpec spec = new PBEKeySpec(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); // we would like this to be "PBKDF2WithHmacSHA512" instead? What Provider implements it?
byte[] hash = skf.generateSecret(spec).getEncoded();

// convert hash and salt to hex and store in DB as CHAR(64)...
Run Code Online (Sandbox Code Playgroud)

use*_*071 51

让我们一块一块地分解这个词:

PBKDF2--WithHmac--SHA512
Run Code Online (Sandbox Code Playgroud)

让我们一起来看看吧

  • PBKDF2

    代表基于密码的密钥导数函数,它是PBKDF1的后继函数,用于实现伪随机函数,例如加密散列,密码或HMAC到输入密码或密码以及salt值并重复该过程多次生成派生密钥,然后可以在后续操作中将其用作加密密钥.

  • HMAC

    密钥哈希消息认证码(HMAC)的代表是用于计算涉及密码散列函数结合秘密密码密钥的消息认证码(MAC)的特定结构.任何加密散列函数都可以用于计算HMAC; 因此,所得到的MAC算法被称为HMAC-MD5或HMAC-SHA1.

  • SHA512

    嗯,你知道的..:P

现在,回到你的问题,代码行:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
Run Code Online (Sandbox Code Playgroud)

指定使用该算法的keyFactory PDBKDF2WithHmacSHA1.什么时候你会这样做:

SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");
Run Code Online (Sandbox Code Playgroud)

你告诉工厂使用算法PBDKF2WithHmacSHA512.

Essentialy之间的主要区别PBKDF2WithHmacSHA1,并PBKDF2WithHmacSHA512认为:

  1. PBKDF2WithHmacSHA1产生的160个比特的散列长度.
  2. PBKDF2WithHmacSHA512产生的512个比特的散列长度.

因此后者更安全.但双方都有争论哪些足以加密.没有辩论.只是说.

有关这两种算法的一些其他信息:

  1. HMACSHA1

    HMACSHA1是一种密钥哈希算法,它是从SHA1哈希函数构造的,并用作HMAC或基于哈希的消息认证码.HMAC进程将密钥与消息数据混合,使用散列函数散列结果,再次将该散列值与密钥混合,然后第二次应用散列函数.输出散列的长度为160位.

  2. HMACSHA512

    HMACSHA512是一种密钥哈希算法,它由SHA-512哈希函数构成,并用作基于哈希的消息认证码(HMAC).HMAC进程将密钥与消息数据混合并散列结果.哈希值再次与密钥混合,然后第二次哈希.输出散列的长度为512位.

主要优点是HmacWith512比安全更安全HmacWith256.例如

HMAC_SHA1("key","The quick brown fox jumps over the lazy dog") = 0xde7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9

HMAC_SHA512("key","The quick brown fox jumps over the lazy dog") = 0xb42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a
Run Code Online (Sandbox Code Playgroud)

差异非常大(如图所示).希望能帮助到你.:)

编辑:正如OP提到的那样

PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)
Run Code Online (Sandbox Code Playgroud)

该参数keyLength用于指示可变密钥大小密码的密钥长度的首选项.实际密钥大小取决于每个提供商的实现.因此,说,做一些事情

PBEKeySpec(password, salt, int 100, 512)并不意味着你将使用SHA1生成512的keyLength.它只是意味着.SHA1最多支持160位.你不能超过这个.

至于你的第二个问题,看看HMAC-SHA1.SHA256如果你是一个很长的哈希,有许多声明说算法非常好.

另外,根据NSA:

NSA规定"使用FIPS-186-2和SHA-256中规定的256位素数模数椭圆曲线的椭圆曲线公钥密码术适用于保护高达SECRET级别的机密信息.使用384位素数模数椭圆曲线和SHA-384是保护TOP SECRET信息所必需的.

我认为结合使用HMAC功能SHA512非常安全.

  • 您提到 `PDBKDF2WithHmacSHA1` 和 `PDBKDF2WithHmacSHA512` 之间的主要区别在于它们产生不同的哈希长度(分别为 160 位和 512 位)。但是我认为这是不正确的,因为`PBEKeySpec(char[] password, byte[] salt, int iterationCount, int keyLength)` 中的`keyLength` 参数控制了生成的散列的长度。如果我指定 `512`、`256` 和 `160` 运行这个,我会得到不同长度的各自哈希值。 (2认同)