gpt4 book ai didi

c# - 如何在 C# 中生成 HMAC-SHA1?

转载 作者:IT老高 更新时间:2023-10-28 20:40:18 30 4
gpt4 key购买 nike

我正在尝试使用 C# 来使用 REST API。 API 创建者提供了 PHP、Ruby 和 Java 的示例库。我被它的一部分挂断了,我需要生成 HMAC .

这是他们提供的示例库中的完成方式。

PHP

hash_hmac('sha1', $signatureString, $secretKey, false);

鲁比

digest = OpenSSL::Digest::Digest.new('sha1')
return OpenSSL::HMAC.hexdigest(digest, secretKey, signatureString)

Java

SecretKeySpec signingKey = new SecretKeySpec(secretKey.getBytes(), HMAC_SHA1_ALGORITHM);

Mac mac = null;
mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
mac.init(signingKey);

byte[] bytes = mac.doFinal(signatureString.getBytes());

String form = "";
for (int i = 0; i < bytes.length; i++)
{
String str = Integer.toHexString(((int)bytes[i]) & 0xff);
if (str.length() == 1)
{
str = "0" + str;
}

form = form + str;
}
return form;

这是我在 C# 中的尝试。 它不工作。 更新: 下面的 C# 示例工作得很好。我发现真正的问题是由于我的 signatureString 中换行符的一些跨平台差异。

var enc = Encoding.ASCII;
HMACSHA1 hmac = new HMACSHA1(enc.GetBytes(secretKey));
hmac.Initialize();

byte[] buffer = enc.GetBytes(signatureString);
return BitConverter.ToString(hmac.ComputeHash(buffer)).Replace("-", "").ToLower();

最佳答案

Vimvq1987's answer 的扩展名:

return hashValue.ToString(); 不会产生您想要/需要的输出。您必须将数组 hashValue 中的字节转换为它们的十六进制字符串表示形式。
可以像 return BitConverter.toString(hashValue); 一样简单(打印大写字母 A-F),或者如果你喜欢它更复杂一点:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace ConsoleApplication1
{
class Program
{
public static string Encode(string input, byte[] key)
{
HMACSHA1 myhmacsha1 = new HMACSHA1(key);
byte[] byteArray = Encoding.ASCII.GetBytes(input);
MemoryStream stream = new MemoryStream(byteArray);
return myhmacsha1.ComputeHash(stream).Aggregate("", (s, e) => s + String.Format("{0:x2}",e), s => s );
}


static void Main(string[] args)
{
byte[] key = Encoding.ASCII.GetBytes("abcdefghijklmnopqrstuvwxyz");
string input = "";
foreach (string s in new string[] { "Marry", " had", " a", " little", " lamb" })
{
input += s;
System.Console.WriteLine( Encode(input, key) );
}
return;
}
}
}

打印出来的

3545e064fb59bc4bfc02b6e1c3d4925c898aa504
3249f4c8468d4d67f465937da05b809eaff22fdb
87baaadf5d096677f944015e53d283834eb1e943
6325376820c29a09e3ab30db000033aa71d6927d
54579b0146e2476595381d837ee38863be358213

我得到完全相同的结果

<?php
$secretKey = 'abcdefghijklmnopqrstuvwxyz';

$signatureString = '';
foreach( array('Marry',' had',' a',' little',' lamb') as $s ) {
$signatureString .= $s;
echo hash_hmac('sha1', $signatureString, $secretKey, false), "\n";
}

编辑:Dmitriy Nemykin建议进行以下编辑

public static string Encode(string input, byte[] key)
{
byte[] byteArray = Encoding.ASCII.GetBytes(input);
using(var myhmacsha1 = new HMACSHA1(key))
{
var hashArray = myhmacsha1.ComputeHash(byteArray);
return hashArray.Aggregate("", (s, e) => s + String.Format("{0:x2}",e), s => s );
}
}

被拒绝了。但正如詹姆斯在对此答案的评论中已经指出的那样,至少 using statement 一个好点。

关于c# - 如何在 C# 中生成 HMAC-SHA1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6067751/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com