java 实现PHP hash_hmac 的 ripemd160 加密算法

发布于 2021-05-10 15:49:01

引入Bouncy Castle Provider

java 原生是不支持 ripemd160 必须得引用第三方插件:Bouncy Castle Provider

        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.68</version>
        </dependency>

java类

package com.nuomiphp.demo.library;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

/**
 * 1. HmacRipeMD160编码结果需要转换成hex格式
 *
 * 2. java中base64的实现和php不一致,其中java并不会在字符串末尾填补=号以把字节数补充为8的整数
 *
 * 3. HmacRipeMD160并非sha1, HmacRipeMD160是需要共享密钥的
 *
 * @author nuomiphp
 *
 */
public class HmacRipeMD160 {

    private static final String HMAC_SHA1 = "HmacRipeMD160";

    /**
     * 生成签名数据HmacRipeMD160加密
     *
     * @param data
     *            待加密的数据
     * @param key
     *            加密使用的key
     * @throws InvalidKeyException
     * @throws NoSuchAlgorithmException
     */
    public static String getSignature(String data, String key) throws Exception {
        Security.addProvider(new BouncyCastleProvider());
        byte[] keyBytes = key.getBytes();
        // 根据给定的字节数组构造一个密钥。
        SecretKeySpec signingKey = new SecretKeySpec(keyBytes, HMAC_SHA1);
        try {
            Mac mac = Mac.getInstance(HMAC_SHA1);
        }catch (Exception e){
            System.out.println(e.getMessage());
            String tt = e.getMessage();
        }
        Mac mac = Mac.getInstance(HMAC_SHA1);
        mac.init(signingKey);

        byte[] rawHmac = mac.doFinal(data.getBytes());

        String hexBytes = byte2hex(rawHmac);
        return hexBytes;
    }

    private static String byte2hex(final byte[] b) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
            stmp = (java.lang.Integer.toHexString(b[n] & 0xFF));
            if (stmp.length() == 1) {
                hs = hs + "0" + stmp;
            } else {
                hs = hs + stmp;
            }
        }
        return hs;
    }
}

调用

String token = HmacRipeMD160.getSignature("abc", "key");
0 条评论

发布
问题