文本加密工具类
- 1.算法简介
- 1.1 MD5
- 1.2 SHA-1
- 1.3 SHA-2(推荐使用)
- 1.4 SHA-3(推荐使用)
- 1.5 RIPEMD-160
- 2.工具类案例
- 2.1POM导入
- 2.2代码编写
- 2.3 输出示例
1.算法简介
1.1 MD5
MD5 (Message-Digest Algorithm 5)
- 描述:MD5 是一种广泛使用的哈希算法,它生成一个 128 位(16 字节)的散列值。
- 用途:最初用于数据完整性检查、密码散列等。
- 安全性:由于已知的安全漏洞,MD5 不再推荐用于安全性要求高的场景,例如密码存储。但仍然用于某些非安全相关的情景,如数据校验。
1.2 SHA-1
SHA-1 (Secure Hash Algorithm 1)
- 描述:SHA-1 生成一个 160 位(20 字节)的散列值。
- 用途:广泛应用于数字签名标准(Digital Signature Standard, DSS)以及其他需要数据完整性的场合。
- 安全性:由于存在碰撞攻击的风险,SHA-1 已不再被认为是安全的,特别是在密码学安全方面。
1.3 SHA-2(推荐使用)
SHA-2 (Secure Hash Algorithm 2)
- 描述:SHA-2 是一组散列函数,包括 SHA-224、SHA-256、SHA-384 和 SHA-512,分别生成 224、256、384 和 512 位的散列值。
- 用途:用于密码存储、数字签名、安全协议等。
- 安全性:SHA-2 被认为是目前比较安全的散列算法之一,尤其是 SHA-256 和 SHA-512,在大多数安全应用中被广泛推荐使用。
1.4 SHA-3(推荐使用)
SHA-3 (Keccak)
- 描述:SHA-3 是 NIST 于 2012 年公布的一种新的哈希函数标准,基于 Keccak 算法,提供了多种输出长度(224、256、384 和 512 位)。
- 用途:SHA-3 被设计用于替代 SHA-2,提供更高的安全性保证。
- 安全性:SHA-3 被认为是非常安全的,适用于各种密码学安全场景。
1.5 RIPEMD-160
RIPEMD-160 (RACE Integrity Primitives Evaluation Message Digest)
- 描述:RIPEMD-160 生成一个 160 位(20 字节)的散列值。
- 用途:常用于比特币等加密货币中,用于地址生成。
- 安全性:虽然 RIPEMD-160 在加密货币领域被广泛应用,但在其他领域,特别是需要高度安全性的场合,它的使用较少
2.工具类案例
2.1POM导入
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.70</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.2.1-jre</version>
</dependency>
2.2代码编写
package cn.zhangsan.tools.enums;
/**
* @ClassName Algorithm
* @Description TODO
* @Author ZhangSan_Plus
* @Date 2024/7/29 20:45
* @Version 1.0
**/
public enum Algorithm {
MD5, SHA1, SHA256, SHA512, RIPEMD160, SHA224, SHA384, SHA3;
}
package cn.zhangsan.tools.utils;
import cn.zhangsan.tools.enums.Algorithm;
import com.google.common.collect.Maps;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.util.Base64;
import java.util.Map;
/**
* @ClassName HashGeneratorUtils
* @Description TODO
* @Author ZhangSan_Plus
* @Date 2024/7/29 20:04
* @Version 1.0
**/
public class HashGeneratorUtils {
static Map<Object, String> map = Maps.newLinkedHashMap();
static {
Security.addProvider(new BouncyCastleProvider());
}
public static void main(String[] args) {
String input = "张三";
try {
Map<Object, String> hashText = getHashText(input, 4);
hashText.forEach((k, v) -> System.out.println(k + ":" + v));
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
public static String extractDomain(String urlString) {
try {
URL url = new URL(urlString);
return url.getHost();
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
}
private static Map<Object, String> getHashText(String text, int digest) throws NoSuchAlgorithmException {
map.put(Algorithm.MD5, encryption(md5(text), digest));
map.put(Algorithm.SHA1, encryption(sha1(text), digest));
map.put(Algorithm.SHA256, encryption(sha224(text), digest));
map.put(Algorithm.SHA224, encryption(sha256(text), digest));
map.put(Algorithm.SHA512, encryption(sha384(text), digest));
map.put(Algorithm.SHA384, encryption(sha512(text), digest));
map.put(Algorithm.SHA3, encryption(sha3_256(text), digest));
map.put(Algorithm.RIPEMD160, encryption(ripemd160(text), digest));
return map;
}
private static byte[] md5(String input) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("MD5");
return digest.digest(input.getBytes());
}
private static byte[] sha1(String input) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
return digest.digest(input.getBytes());
}
private static byte[] sha224(String input) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-224");
return digest.digest(input.getBytes());
}
private static byte[] sha256(String input) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
return digest.digest(input.getBytes());
}
private static byte[] sha384(String input) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-384");
return digest.digest(input.getBytes());
}
private static byte[] sha512(String input) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-512");
return digest.digest(input.getBytes());
}
private static byte[] sha3_256(String input) throws NoSuchAlgorithmException {
MessageDigest digest = null;
try {
digest = MessageDigest.getInstance("SHA3-256", "BC");
} catch (NoSuchProviderException e) {
throw new RuntimeException(e);
}
return digest.digest(input.getBytes());
}
private static byte[] ripemd160(String input) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("RIPEMD160");
return digest.digest(input.getBytes());
}
private static String toHexString(byte[] bytes) {
return Hex.toHexString(bytes);
}
private static String toBase64(byte[] bytes) {
return Base64.getEncoder().encodeToString(bytes);
}
private static String toBase64Url(byte[] bytes) {
return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes);
}
private static String toBinary(byte[] bytes) {
StringBuilder binaryString = new StringBuilder();
for (byte b : bytes) {
for (int i = 7; i >= 0; i--) {
binaryString.append(((b >> i) & 1) == 1 ? '1' : '0');
}
binaryString.append("");
}
return binaryString.toString().trim();
}
private static String encryption(byte[] bytes, int encoding) {
switch (encoding) {
case 1:
return toHexString(bytes);
case 2:
return toBinary(bytes);
case 3:
return toBase64(bytes);
case 4:
return toBase64Url(bytes);
default:
return "";
}
}
}