前言:算法
工做須要,對接華爲雲應用市場的 API 接口,因爲維護團隊都是 .NET 因此用 .NET 來開發。數組
簡單瞭解一下 SHA256 加密算法,本質就是一個 Hash,與 MD5 相比就是計算量大一些,具體的沒時間細化。編碼
1、Java SHA256 加密算法實現代碼 (最終以 Base64 方式進行簽名驗證)加密
1 /** 2 * 3 * hamcSHA256加密算法 4 * @param macKey 祕鑰key 5 * @param macData 加密內容-響應消息體 6 * @return 加密密文 7 * @throws NoSuchAlgorithmException 8 * @throws InvalidKeyException 9 * @throws IllegalStateException 10 * @throws UnsupportedEncodingException 11 */ 12 public static byte[] hmacSHA256(String macKey, String macData) throws NoSuchAlgorithmException, InvalidKeyException, IllegalStateException, UnsupportedEncodingException { 13 14 SecretKeySpec secret = new SecretKeySpec(macKey.getBytes(), "HmacSHA256"); 15 Mac mac = Mac.getInstance("HmacSHA256"); 16 mac.init(secret); 17 18 byte[] doFinal = mac.doFinal(macData.getBytes("UTF-8")); 19 return doFinal; 20 }
1 /** 2 * 3 * 字節數組轉字符串 4 * @param bytes 字節數組 5 * @return 字符串 6 */ 7 public static String base_64(byte[] bytes) 8 { 9 return new String(Base64.encodeBase64(bytes)); 10 }
2、.NET SHA256 加密算法實現代碼spa
/// <summary> /// hamcSHA256加密實現 /// </summary> /// <returns>The token.</returns> /// <param name="secret">Secret.</param> /// <param name="message">Message.</param> public static string CreateToken(string secret, string message) { var encoding = new System.Text.ASCIIEncoding(); byte[] keyByte = encoding.GetBytes(secret);
// 注意:若是是中文注意轉換編碼格式 byte[] messageBytes = encoding.GetBytes(message); using (var hmacsha256 = new HMACSHA256(keyByte)) { byte[] hashmessage = hmacsha256.ComputeHash(messageBytes); // 注意:Java (u127)與.NET byte(255) 存儲方式不一樣,因此須要轉換一下。 sbyte[] sb = new sbyte[hashmessage.Length]; for (int i = 0; i < hashmessage.Length; i++) { sb[i] = hashmessage[i] < 127 ? (sbyte)hashmessage[i] : (sbyte)(hashmessage[i] - 256); } byte[] unsignedByteArray = (byte[])(Array)sb; return Convert.ToBase64String(unsignedByteArray); } }
問題總結:code
一、轉 byte[] 數組,注意編碼格式;blog
二、Java 中的 byte 與 .NET 中的 byte 存儲方式不一樣,Java 是 -127~12七、.NET 是 0~2555token
三、轉換 Base64 一樣,若是不進行轉換結果會不一致,採用 sbyte[] 進行一輪轉換再 Base64;接口