我正在制作一个关于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初始化...
答案 0 :(得分:2)
用于从密码派生AES密钥的两种典型方法是:
使用密码的原始字节。此选项不是很强(取决于琐碎的dictionary attacks)并且依赖于密码正好是128/192/256位。
使用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
值是随机字节数组(即可能是8个字节)。可以增加iterations
以提高安全性,但会牺牲性能。