1

我正在制作一个关于 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();

我能理解的是如何定义一个SecretKeyto MAC init ...

4

1 回答 1

2

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

  1. 使用密码的原始字节。这个选项不是很强大(受到微不足道的字典攻击)并且依赖于密码正好是 128/192/256 位。

  2. 使用函数派生密钥,例如 PBKDF2。

您需要找出密钥是如何派生的。代码中的两个选项是:

原始字节

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值是一个随机字节数组(即可能是八个字节)。可以以iterations牺牲性能为代价提高安全性。

于 2013-04-23T16:51:20.017 回答