C#實作HMACSHA256加密演算法
在使用MQTT連接華為云時,發現通過密鑰方式連接用了HMACSHA256加密演算法,而在單片機中實作該演算法還是有點困難,畢竟在單片機上運行記憶體有限,在專案中,我是使用了C#做一個配置軟體,通過配置軟體來實作它的加密,而單片機只管通過MQTT連接,
首先介紹一下什么是HMAC
HMAC是一種使用單向散列函式來構造訊息認證碼的方法,其中HMAC中的H就是Hash的意思,
HMAC中所使用的單向散列函式并不僅限于一種,任何高強度的單向散列函式都可以被用于HMAC,如果將來設計出的新的單向散列函式,也同樣可以使用,
使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所構造的HMAC,分別稱為HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-384、HMAC-SHA-512,
演算法的描述
在HMAC的定義中用到一個密碼散列函式H和一個密鑰K,假設H是一個能夠對明文進行分組回圈壓縮的散列函式,B為散列函式的明文分組長度(byte),在上述的散列函式中B=64,L為散列函式的輸出長度(byte),MD5中L=16,SHA-1中L=20,認證密鑰K可以為任意長度,一般密鑰長度應大于明文分組的長度,將密鑰的第一次散列值作為HMAC真正使用的密鑰,密鑰的最小推薦長度為Lbytes,
再定義兩個不同的固定字串ipad和opad如下(“i”和“o”表示內部和外部):
ipad=一個位元組(byte)的0x36重復B次;
opad=一個位元組(byte)的0x5C重復B次,
若以“text”作為要計算HMAC的明文,則作如下操作:
H(K XOR opad,H(K XOR ipad,text))
也就是說,操作步驟如下:
(1)在密鑰K后面填充0,使其成為長度為Bbyte的字串;如:K是20bytes的字串,B=64,則要填充44個位元組的0x00,
(2)用第一步得到的Bbyte的字串與ipad作XOR(按位異或);
(3)將資料流text附加到第(2)步產生的Bbyte字串后面;
(4)對第(3)產生的資料流用散列函式H計算訊息摘要;
(5)用第一步得到的Bbyte的字串與opad作XOR(按位異或);
(6)將第(4)生成的訊息摘要附加到第(5)步的Bbyte字串之后;
(7)對第(6)產生的資料流用散列函式H計算訊息摘要,作為輸出 ,
C#具體實作函式
private string HmacSHA256(string secret, string signKey)
{
string signRet = string.Empty;
using (HMACSHA256 mac = new HMACSHA256(Encoding.UTF8.GetBytes(signKey)))
{
byte[] hash = mac.ComputeHash(Encoding.UTF8.GetBytes(secret));
signRet = Convert.ToBase64String(hash);
// signRet = ToHexString(hash);
}
return signRet;
}
如果需要輸出16進制,則呼叫
signRet = ToHexString(hash);
在華為云加密中,輸入引數為 密鑰(deviceSecret)和時間戳(dataForm)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290510.html
標籤:其他
上一篇:對不起,云計算技術又走錯路了
下一篇:嵌入式--->總目錄
