关于C# 的hmacSHA1加密方法的使用

wsmzhyangzi 2012-07-02 04:14:14
简短的来说:我发送http请求要从人家那获取一些信息,在http的header里面增加一些参数,其中就有特定的的参数需要用hmacSHA1来加密。
对方提供了JAVA的SDK,但没有C#的,java的主要加密实现为:
public static String generateMacSignature( String secret,String data) {
logger.debug("generateDate is:"+data);
logger.debug("secret is:"+secret);
byte[] byteHMAC = null;

try {
Mac mac = Mac.getInstance(HMAC_SHA1);
SecretKey secretKey = new SecretKeySpec(secret.getBytes("utf-8"),
HMAC_SHA1);

mac.init(secretKey);
byteHMAC = mac.doFinal(data.getBytes("utf-8"));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

String result = new BASE64Encoder().encode(byteHMAC);
logger.debug("generateMacSignature is:"+result);
return result;

}

我从网上找了些相关资料,换成C#的为:
public static string HMACSHA1Encrypt(string EncryptText,string EncryptKey)
{
HMACSHA1 myHMACSHA1 = new HMACSHA1(Encoding.UTF8.GetBytes(EncryptKey));
byte[] RstRes = myHMACSHA1.ComputeHash(Encoding.UTF8.GetBytes(EncryptText));
//CryptoStream CStream = new CryptoStream(Stream.Null, myHMACSHA1, CryptoStreamMode.Write);
//CStream.Write(RstRes, 0, RstRes.Length);
StringBuilder EnText = new StringBuilder();
foreach (byte Byte in RstRes)
{
EnText.AppendFormat("{0:x2}", Byte);
}
return EnText.ToString();
}

但加密出来的结果始终是不对的,自然回来的信息也是:加密错误。
请问哪位大侠知道C#的hmacSHA1加密正确的方式是怎么样的?我已经在google上搜遍了
...全文
1891 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ip159357 2013-07-25
  • 打赏
  • 举报
回复
楼主 这个问题我也遇到了 我解决的方法是
public static string HmacSha1Sign(string text, string key)
        {
            Encoding encode = Encoding.GetEncoding(input_charset);
            byte[] byteData = encode.GetBytes(text);
            byte[] byteKey = encode.GetBytes(key);
            HMACSHA1 hmac = new HMACSHA1(byteKey);
            CryptoStream cs = new CryptoStream(Stream.Null, hmac, CryptoStreamMode.Write);
            cs.Write(byteData, 0, byteData.Length);
            cs.Close();
            return Convert.ToBase64String(hmac.Hash);
        }
你可以试试
wsmzhyangzi 2012-07-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
看Java代码的最后是用BASE64转换字节数组的,LZ你是自己转16进制字符串,结果当然会不一样。
最后return Convert.ToBase64String(RstRes);应该就可以了
[/Quote]

用到了Base64,出来的结果还是不同,因为在hmacSHA1加密后的值都已经不同了,所以base64出来的也不同。
iyomumx 2012-07-02
  • 打赏
  • 举报
回复
看Java代码的最后是用BASE64转换字节数组的,LZ你是自己转16进制字符串,结果当然会不一样。
最后return Convert.ToBase64String(RstRes);应该就可以了
wsmzhyangzi 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
生成的串有木有乱码!是不是用到Base64转意了
[/Quote]

没有乱码,嗯,用到base64了
白鸽 2012-07-02
  • 打赏
  • 举报
回复
生成的串有木有乱码!是不是用到Base64转意了

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧