如何對Java對象的屬性及其值按照ASCII碼順序獲得一個用於簽名或傳參的連接字符串

有時候我們通信的時候要對參數進行簽名,以防止在通信過程中被篡改,在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編輯器寫的,可能編譯不過,如有問題,可以聯繫一起調調。閒了我會試試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章