摘要算法hash算法 (變長(zhǎng)變定長(zhǎng)驶社,不能還原堵腹,MD5奔脐、SHA俄周、CRC )
它是不可逆的吁讨,不可以解密。所以它只能算的上是一種單向加密算法
名稱 | 安全性 | 速度 |
---|---|---|
SHA-1 | 高 | 慢 |
MD5 | 中 | 快 |
- MD5(Message-Digest Algorithm 5(信息-摘要算法5)):用的是哈希函數(shù)峦朗,它的典型應(yīng)用是對(duì)一段信息產(chǎn)生 信息摘要建丧,以 防止被篡改。無論是多長(zhǎng)的輸入波势,MD5 都會(huì)輸出長(zhǎng)度為 128bits 的一個(gè)串 (通常用 16 進(jìn)制 表示為 32 個(gè)字符)翎朱。
public static final byte[] computeMD5(byte[] content) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
return md5.digest(content);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
- SHA1(Secure Hash Algorithm 1):比MD5安全性高,但速度相對(duì)于MD5慢尺铣,對(duì)于長(zhǎng)度小于 2 ^ 64 位的消息拴曲,SHA1 會(huì)產(chǎn)生一個(gè) 160 位的 消息摘要。
public static byte[] computeSHA1(byte[] content) {
try {
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
return sha1.digest(content);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
- HMAC(Hash Message Authentication Code): 密鑰相關(guān)的 哈希運(yùn)算消息認(rèn)證碼(Hash-based Message Authentication Code)凛忿,HMAC 運(yùn)算利用 哈希算法 (MD5澈灼、SHA1 等),以 一個(gè)密鑰 和 一個(gè)消息 為輸入店溢,生成一個(gè) 消息摘要 作為 輸出叁熔。
HMAC 發(fā)送方 和 接收方 都有的 key 進(jìn)行計(jì)算,而沒有這把 key 的第三方床牧,則是 無法計(jì)算 出正確的 散列值的荣回,這樣就可以 防止數(shù)據(jù)被篡改。
@NotThreadSafe
public class HMacHelper {
private static final Logger logger = LoggerFactory.getLogger(HMacHelper.class);
private Mac mac;
/**
* MAC算法可選以下多種算法
* HmacMD5/HmacSHA1/HmacSHA256/HmacSHA384/HmacSHA512
*/
private static final String KEY_MAC = "HmacMD5";
public HMacHelper(String key) {
try {
SecretKey secretKey = new SecretKeySpec(key.getBytes(ConstField.UTF8), KEY_MAC);
mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
} catch (Exception e) {
logger.error("create hmac helper failed.", e);
}
}
public byte[] sign(byte[] content) {
return mac.doFinal(content);
}
public boolean verify(byte[] signature, byte[] content) {
try {
byte[] result = mac.doFinal(content);
return Arrays.equals(signature, result);
} catch (Exception e) {
logger.error("verify sig failed.", e);
}
return false;
}
}