最近碰到一个接口是要数字签名的,给的示范是用java写的。一开始没明白直接用了对字节流进行了md5加密,后面在java里面把这段代码运行了一遍才发现md5加密后仍然是字节流,然后在md5中找到了这个
md5.digest(''); // [212, 29, 140, 217, 143, 0, 178, 4, 233, 128, 9, 152, 236, 248, 66, 126]
用base64加密
let u8s = new Uint8Array([100,97,110,107,111,103,97,105]);
Base64.fromUint8Array(u8s); // ZGFua29nYWk=
然后,java和js这两边输出的结果终于一样了。
生成签名:待签名数据以UTF-8的格式转字节流,对字节流进行MD5算法得到的签名字节流,再经过Base64转换为字符串,即生成了数字签名。
java
public static String makeSign(String data, String encode) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(data.getBytes(encode));
byte[] b = md.digest();
return (new sun.misc.BASE64Encoder()).encode(b);
}
javascript
import utf8 from "utf-8"
import md5 from "js-md5"
import {Base64} from "js-base64"
var str="data"//代签名数据
//加密后
var sign=Base64.fromUint8Array(md5.digest(utf8.setBytesFromString(str)))
console.log(sign)