数字签名
为保证数据传输过程中的数据真实性,完整性和不可抵赖,我们需要对数据进行数字签名,在接收接口请求后进行签名校验。
签名机制如下:
- 采用MD5 产生签名摘要。
- 待签名原文是各请求参数的值按照文档中自上而下的顺序组拼装成的字符串,不包括 sign 本身,如果字段值为空或者字段不存在则参数不参与拼装。
- sign=MD5(参数1+参数2+…+参数n+key),其中key 为用户秘钥(可以为任意字符的md5转换,也可以是其它的)。
- base64 编码的字符集为 UTF-8。
- 输出结果为 32 位大写字符串
【代码实现】
import java.security.MessageDigest;
public class md5test {
public static String md5(String content) {
return md5(content, false);
}
public static String md5(String content, boolean is16) {
if (content == null) {
return null;
} else {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(content.getBytes());
return is16 ? getEncode16(digest) : getEncode32(digest);
} catch (Exception var3) {
return null;
}
}
}
private static String getEncode32(MessageDigest digest) {
StringBuilder builder = new StringBuilder();
byte[] var2 = digest.digest();
int var3 = var2.length;
for(int var4 = 0; var4 < var3; ++var4) {
byte b = var2[var4];
builder.append(Integer.toHexString(b >> 4 & 15));
builder.append(Integer.toHexString(b & 15));
}
return builder.toString();
}
private static String getEncode16(MessageDigest digest) {
StringBuilder builder = new StringBuilder();
byte[] var2 = digest.digest();
int var3 = var2.length;
for(int var4 = 0; var4 < var3; ++var4) {
byte b = var2[var4];
builder.append(Integer.toHexString(b >> 4 & 15));
builder.append(Integer.toHexString(b & 15));
}
return builder.substring(8, 24).toString();
}
public static void main(String[] args) {
String url = "https://picgo-xxxxxxxxxx.oss-cn-guangzhou.aliyuncs.com/typoreimgs/image-20220228141923563.png";
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(url);
stringBuffer.append("19d221875903d8d1744651a37a768bda");
String sign = md5(stringBuffer.toString()).toUpperCase();
System.out.println("测试sign:"+sign);
}
}