小白,请教各位大佬!JAVA BASE64 HMACSHA512加密求解答!

需求是会员从C#迁移到了JAVA,但是旧的密码是BASE64(HMACSHA512(value))加密的,用户体验不变,所以java端也要实现这个,可我生成的这么都不对。c#:PBKDF2C#生成的类似:zYKcuNTKMZzvmCptYkXbbfCXkwUiQKf/6qZi/XRNNxSf08pMRcrBO34cj9DMyoQCFOLnbQgDz9aalz8yjbQwng==而我生成的:YjA4OTc2ZDJkNmNhYTk4OGJmODI0M2M1OWExZTJjYjMwMmMzNzFmYzA0ZTA2ZTE0ZjkyNGQyNWNiNGI2MTA1ZDc1YTUzNTJjZjI1YjY4ODlhY2JhMTk2M2MwNzcyODE4MjQzZmY3YzczZjMzY2I2OWEyMGIyM2ZkYmNiOTAwOGY=哪有问题?
下面是代码
importjavax.crypto.spec.SecretKeySpec;
importjavax.crypto.Mac;
importjava.util.Base64;
publicclassHMAC{
/**
*定义加密方式
*MAC算法可选以下多种算法
*
*HmacMD5
*HmacSHA1
*HmacSHA256
*HmacSHA384
*HmacSHA512
*
*/
privatestaticfinalStringHMAC_SHA1="HmacSHA512";
/**
*生成签名数据_HmacSHA1加密
*
*@paramdata
*待加密的数据
*@paramkey
*加密使用的key
*/
publicstaticStringgetSignature(Stringdata,Stringkey)throwsException{
byte[]keyBytes=key.getBytes();
//根据给定的字节数组构造一个密钥。
SecretKeySpecsigningKey=newSecretKeySpec(keyBytes,HMAC_SHA1);
Macmac=Mac.getInstance(HMAC_SHA1);
mac.init(signingKey);
byte[]rawHmac=mac.doFinal(data.getBytes());
StringhexBytes=byte2hex(rawHmac);
returnhexBytes;
}
privatestaticStringbyte2hex(finalbyte[]b){
Stringhs="";
Stringstmp="";
for(intn=0;n//以十六进制(基数16)无符号整数形式返回一个整数参数的字符串表示形式。
stmp=(java.lang.Integer.toHexString(b[n]&0xFF));
if(stmp.length()==1){
hs=hs+"0"+stmp;
}else{
hs=hs+stmp;
}
}
returnhs;
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
try{
Stringsignature=getSignature("3e043a92a204412cb7098b67c017b1cf","ants@xpress");
Stringbase64String=Base64.getEncoder().encodeToString(signature.getBytes("UTF-8"));
System.out.println(base64String);
}catch(Exceptione){
e.printStackTrace();
}
}
}
千巷猫影
浏览 504回答 2
2回答

慕妹3242003

直接对签名算法生成的字节数组做base64编码,不要先转成HAXstring。base64和转成hex都是将字节序列转成可以阅读的字符形式,一般在设计上不会同时使用,同时使用的话只会徒增结果长度,对安全性提升意义不大。hmac是签名算法,作为开发者建议分清编码、摘要/哈希/杂凑、签名以及加密的区别publicstaticbyte[]getSignature(Stringdata,Stringkey)throwsException{byte[]keyBytes=key.getBytes();//根据给定的字节数组构造一个密钥。SecretKeySpecsigningKey=newSecretKeySpec(keyBytes,HMAC_SHA1);Macmac=Mac.getInstance(HMAC_SHA1);mac.init(signingKey);returnmac.doFinal(data.getBytes());}publicstaticvoidmain(String[]args){try{finalbyte[]signature1=getSignature("3e043a92a204412cb7098b67c017b1cf","ants@xpress");Stringbase64String=Base64.getEncoder().encodeToString(signature1);System.out.println(base64String);}catch(Exceptione){e.printStackTrace();}}

杨魅力

你确定是BASE64(HMACSHA512(value))还是PBKDF2-HMACSHA512,这是两种完全不同的加密方式。后者的话你还需要dkLen、c和salt才能得到相同的结果。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript