[ 摘要 ] HMAC - MD5遇到彩虹表怎么办?

2021-08-31  本文已影响0人  一个好汉

HMAC 你是谁

HMAC 又称哈希运算消息认证码
运算利用 哈希算法 (MD5、SHA1 等),输入密钥和消息,生成消息摘要
HMAC 发送方和接收方只有拥有认证码也就是秘钥方能进行认证。

类型

MAC算法可选以下多种算法

这里以 HmacMD5 为例

HmacMD5作用

  1. HmacMD5使用的key长度是64字节,更安全;
  2. Hmac是标准算法,同样适用于SHA-1等其他哈希算法;
  3. Hmac输出和原有的哈希算法长度一致。

coding

import lombok.extern.slf4j.Slf4j;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * hmac 帮助类
 * HMAC 算法实例mac在多线程环境下是不安全的。需要在多线程访问时,使用ThreadLocal为每个线程缓存一个实例可解决
 */
@Slf4j
public class HMacHelper {
    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(StandardCharsets.UTF_8), KEY_MAC);
            mac = Mac.getInstance(secretKey.getAlgorithm());
            mac.init(secretKey);
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            log.info("init HMacHelper failed", e);
        }
    }

    /**
     * 获取签名
     */
    public byte[] sign(byte[] content) {
        return mac.doFinal(content);
    }

    /**
     * 验证签名是否正确
     */
    public boolean verify(byte[] signature, byte[] content) {
        byte[] result = mac.doFinal(content);
        return Arrays.equals(signature, result);
    }
}


参考

零壹技术栈
Hmac算法

上一篇 下一篇

猜你喜欢

热点阅读