Crypto

优质
小牛编辑
125浏览
2023-12-01

Overview

因为Java的Crypto API始终有点难用,SpringSide在core module中的org.springside.modules.security.utils中提供了封装。
API的出入参数都是byte[]数组,需要配合Encodes来转换成Hex或Base64存储。

Digests消息摘要

去年一轮的密码被盗风波后,使用salt并迭代N次的sha-1式密码存储已经是标配了。
使用随机salt,是避免相同的密码的sha-1值相同,还是容易被穷举的猜到。
而迭代N次,纯粹是加大暴力破解的难度。

因此,针对字符串消息摘要API如下:

public static byte[] sha1(String input); 
public static byte[] sha1(String input, byte[] salt);
public static byte[] sha1(String input, byte[] salt, int iterations);
public static byte[] generateSalt(int numBytes);

另外,对文件内容的消息摘要,也提供了一套API。与前面的字符串处理不一样的是,它会一边8k,8k的读,一边调用digest.update(),而不是一次过digest()整个文件。

Crypto加密

Hmac密钥签名

sha1,md5只是用来摘要,但因为是公开算法,人人都可以对公开内容做出相同的摘要。而hmac是使用密钥的摘要,等同于 Des(sha1(input)),可以达到签名的效果,保证是你自己签的。 HmacSha1Key的默认长度是160字节。

public static byte[] hmacSha1(byte[] input, byte[] key);
public static boolean isMacValid(byte[] expected, byte[] input, byte[] key);
public static byte[] generateHmacSha1Key();

AES密钥加密

是DES协议的替代者,解决了DES中的不少问题,比如DES的Key长度只有64字节,3DES也只有128, 而AES可以是是128,192和256。

和Hash中的salt值一样,AES中也有一个IV(初始向量)的概念,使得相同的明文会加密出不同的密文。不过要使用IV,就不能使用默认的EBC分组方式,加密算法要从"AES"改为"AES/CBC/PKCS5Padding"。

public static byte[] aesEncrypt(byte[] input, byte[] key)
public static byte[] aesEncrypt(byte[] input, byte[] key, byte[] iv)
public static String aesDecrypt(byte[] input, byte[] key)
public static String aesDecrypt(byte[] input, byte[] key, byte[] iv)
public static byte[] generateAesKey()
public static byte[] generateIV()

总结

总体来说, 使用salt并1024次迭代的sha-1, Hmac 和 Aes分别是摘要,签名和加密的首选协议。