java 原生是不支持 ripemd160
必须得引用第三方插件:Bouncy Castle Provider
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version>
</dependency>
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");