有時候我們通信的時候要對參數進行簽名,以防止在通信過程中被篡改,在Java編程中,對Java對象的屬性及其值按照ASCII碼順序獲得一個字符串,用來進行簽名,那麼方法可以按照下面來進行。
直接上代碼把
private static String buildSignStr(Object object) {
try {
if (object == null) {
return null;
}
Map map = new HashMap();
if (object instanceof Map) {
if (((Map) object).isEmpty()) {
return null;
}
map = (Map) object;
} else {
for (Field field : object.getClass().getDeclaredFields()) {
field.setAccessible(true);
map.put(field.getName(), field.get(object));
}
}
TreeMap<String, String> treeMap = new TreeMap<>(map);
StringBuffer strBuffer = new StringBuffer();
treeMap.entrySet().forEach(i -> {
if (i.getValue() == null) {
return;
}
strBuffer.append(i.getKey()).append("=").append(String.valueOf(i.getValue())).append("&");
});
String signStr=strBuffer.substring(0, strBuffer.length() - 1));
return SecurityTool.signRsa(Rsa.SignatureAlgorithm.MD5withRSA, signStr);
} catch (SignatureException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
logger.error("target sign object can`t be null");
return null;
}
進行測試,最終得到類似下圖
其中籤名算法可以自己寫一個,或者引用Java jdk自己的也行。
public class SecurityTool{
public static String sign(final Rsa.SignatureAlgorithm signatureAlgorithm, final RSAPrivateKey rsaPrivateKey, final String data)
throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
Signature signature = Signature.getInstance(signatureAlgorithm.name);
signature.update(data.getBytes(StandardCharsets.UTF_8));
return Base64.encode(signature.sign())
}
}
注意,上面這個是我在CSDN md編輯器寫的,可能編譯不過,如有問題,可以聯繫一起調調。閒了我會試試。