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")));
    }

}

video