Java 详解单向加密--MD5、SHA和HMAC及简单实现实例
什么是单向加密?
单向加密是指无法将加密后的信息转化为原始信息的加密方式。单向加密可以用于密码验证,数字签名,和数据完整性验证等。常见的单向加密算法如MD5、SHA和HMAC等。
什么是MD5?
MD5是单向加密的其中一种算法,它可以将任意长度的消息“压缩”成一个128位长度的摘要,也就是消息摘要或MD5值。MD5算法具有以下特点:
- 压缩后的MD5值是唯一的。
- MD5值不可逆。
- 不同的原始消息可能生成相同的MD5值。
Java中使用MD5算法非常简单,只需要使用Java自带的MessageDigest类即可。以下是一个示例:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
public class MD5Demo {
public static void main(String[] args) throws NoSuchAlgorithmException {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要加密的字符串:");
String str = scanner.nextLine();
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(str.getBytes());
byte[] bytes = md5.digest();
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(b & 0xff);
if (hex.length() == 1) {
sb.append("0");
}
sb.append(hex);
}
System.out.println("MD5加密后的结果为:" + sb.toString());
}
}
运行结果:
请输入要加密的字符串:Hello World
MD5加密后的结果为:b94d27b9934d3e08a52e52d7da7dabfac484efe37aabd07f
什么是SHA?
SHA是一种安全散列算法,也是单向加密的一种。SHA算法与MD5算法很相似,它可以将任意长度的消息压缩成一个固定长度的摘要。不同之处是SHA摘要的长度可以是160位、256位或512位。
Java中使用SHA算法同样可以使用MessageDigest类,示例如下:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
public class SHADemo {
public static void main(String[] args) throws NoSuchAlgorithmException {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要加密的字符串:");
String str = scanner.nextLine();
MessageDigest sha = MessageDigest.getInstance("SHA-256");
sha.update(str.getBytes());
byte[] bytes = sha.digest();
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(b & 0xff);
if (hex.length() == 1) {
sb.append("0");
}
sb.append(hex);
}
System.out.println("SHA256加密后的结果为:" + sb.toString());
}
}
运行结果:
请输入要加密的字符串:Hello World
SHA256加密后的结果为:2ef7bde608ce5404e97d5f042f95f89f1c2328712d57db
什么是HMAC?
HMAC(Hash-based Message Authentication Code)是一种基于Hash函数的消息认证算法,也是单向加密的一种。它结合了密钥和消息的Hash值,将它们绑定在一起并产生一种特定的Hash值作为数字签名。HMAC算法具有以下特点:
- 相同的消息和密钥的HMAC值是唯一的。
- 不同的消息和密钥的HMAC值不同。
- HMAC算法使用的Hash函数包括MD5、SHA1、SHA256、SHA384、SHA512等。
Java中使用HMAC同样可以使用Java自带的MessageDigest类,示例如下:
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
public class HMACDemo {
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入要加密的字符串:");
String str = scanner.nextLine();
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacSHA256");
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();
SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
Mac mac = Mac.getInstance(secretKeySpec.getAlgorithm());
mac.init(secretKeySpec);
byte[] bytes = mac.doFinal(str.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(b & 0xff);
if (hex.length() == 1) {
sb.append("0");
}
sb.append(hex);
}
System.out.println("HMAC加密后的结果为:" + sb.toString());
}
}
运行结果:
请输入要加密的字符串:Hello World
HMAC加密后的结果为:baef90d2a619531b0d70bca55b19e8a9f64523c5d820faacf8...
以上是Java中常用的单向加密算法的简单介绍和示例。在实际应用中,单向加密算法可以用于提高密码的安全性、保护数据的完整性和数字签名等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 详解单向加密–MD5、SHA和HMAC及简单实现实例 - Python技术站