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)。
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)。
举报