定义生成密钥的密钥

时间:2013-04-23 16:26:08

标签: java macos security aes secret-key

我正在制作一个关于Java安全性的项目。服务器接收密码,并且应该在MAC中插入密码以验证一个特定文件的一致性。

Mac m;
SecretKey sk;
sk = KeyGenerator.getInstance( "AES" ).keygenerator();/* what i don't want to use */
byte[]mac=null;
Mac m = Mac.getInstance("HmacSHA1");
m.init( password ); /* it's wrong */
m.update("work of security".getBytes());
mac = m.doFinal();

我能理解的是如何定义SecretKey到MAC初始化...

1 个答案:

答案 0 :(得分:2)

用于从密码派生AES密钥的两种典型方法是:

  1. 使用密码的原始字节。此选项不是很强(取决于琐碎的dictionary attacks)并且依赖于密码正好是128/192/256位。

  2. 使用PBKDF2等函数派生密钥。

  3. 您需要了解密钥的派生方式。代码中的两个选项是:

    原始字节

    SecretKey aesKey = new SecretKeySpec(password.getBytes(someCharset), "AES");
    

    派生功能

    PBKDF2示例:

    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    SecretKey aesKey = factory.generateSecret(new PBEKeySpec(password, salt,
          iterations, 256));
    

    salt值是随机字节数组(即可能是8个字节)。可以增加iterations以提高安全性,但会牺牲性能。