hash-encrypt
logic

src
Encryptor.java
java
package org.example.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Base64;
import java.util.Objects;
public class Encryptor {
private Encryptor() {
throw new AssertionError("No " + getClass().getName() + " instance for you!");
}
// 6 12 18 24 36 ...
static final int LEN = 12;
static MessageDigest SHA = null;
static {
try {
SHA = MessageDigest.getInstance("SHA-1");
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
public static String encrypt(String password) {
// 非空处理
Objects.requireNonNull(password);
// 生成 12 个比特随机数
final byte[] salt = new byte[LEN];
new SecureRandom().nextBytes(salt);
// 处理盐
SHA.update(salt);
// 处理密码原文
SHA.update(password.getBytes());
// 生成加密结果
byte[] digest = SHA.digest();
// 创建能存储 随机盐 + 加密结果的比特数组
byte[] r = new byte[LEN + digest.length];
// 将随机盐复制到 结果数组的前 12 位置上
System.arraycopy(salt, 0, r, 0, LEN);
// 将加密结果复制到 结果数组剩余位置上
System.arraycopy(digest, 0, r, LEN, digest.length);
// 将最终结果进行 base64 编码以获得可打印字符
return Base64.getEncoder().encodeToString(r);
}
public static boolean validator(String password, String encrypted) {
Objects.requireNonNull(password);
Objects.requireNonNull(encrypted);
// 将加密密文进行 base64 解码
byte[] base64 = Base64.getDecoder().decode(encrypted);
// 取出加密密文中的随机盐
byte[] salt = Arrays.copyOf(base64, LEN);
// 处理盐
SHA.update(salt);
// 处理当次密码原文
SHA.update(password.getBytes());
// 获得当次加密密文
byte[] digest = SHA.digest();
// 取出上次加密密文
byte[] digested = Arrays.copyOfRange(base64, LEN, base64.length);
// 校验两次加密密文
return Arrays.equals(digest, digested);
}
public static void main(String[] args) {
// lk14h7XjM62qomf+EoPRKQhOF8C2KYswEgjFT/LgI1E=
System.out.println(encrypt("123456"));
// hVg6ezfL3zltFFh+jD9IsWr07FJ56pe77tsmKrHWamY=
System.out.println(encrypt("123456"));
// true
System.out.println(validator("123456", encrypt("123456")));
// false
System.out.println(validator("123457", encrypt("123456")));
}
}