C# 使用HMAC384生成Nominex请求

C# 使用HMAC384生成Nominex请求,c#,rest,sha256,hmac,C#,Rest,Sha256,Hmac,我正在尝试对Nominex API进行身份验证,但我找不到任何向Nominex请求的C#示例。文档中只有node.js示例。我正试图把它转换成C#,但运气不太好,不确定我做错了什么。我得到的结果是无效的凭据 JavaScript中的示例 const crypto = require('crypto') const request = require('request') const apiKey = '...' const apiSecret = '...' const apiPath =

我正在尝试对Nominex API进行身份验证,但我找不到任何向Nominex请求的C#示例。文档中只有node.js示例。我正试图把它转换成C#,但运气不太好,不确定我做错了什么。我得到的结果是无效的凭据

JavaScript中的示例

const crypto = require('crypto')
const request = require('request')

const apiKey = '...'
const apiSecret = '...'

const apiPath = '/api/rest/v1/private/wallets'
const nonce = Date.now().toString()
const queryParams = ''
const body = undefined
let signature = `/api${apiPath}${nonce}${body ? JSON.stringify(body) : ''}`

const sig = crypto.createHmac('sha384', apiSecret).update(signature)
const shex = sig.digest('hex')

const options = {
url: `https://nominex.io/${apiPath}?${queryParams}`,
headers: {
  'nominex-nonce': nonce,
  'nominex-apikey': apiKey,
  'nominex-signature': shex
},
  body: body,
  json: true
}
request.get(options, (error, response, body) => {
  console.log(body);
})
我在C语言中的尝试#

private异步任务GetRequest()
{
HttpClient=新的HttpClient();
字符串secretKey=apiSecret;
TimeSpan t=(DateTime.UtcNow-新的日期时间(1970,1,1));
long nonce=(long)t.total毫秒;
字符串体=”;
string requestPath=“/api/rest/v1/private/orders/BTC/USDT”;
string prehashString=string.Join(“”,requestPath,nonce.ToString(),body);
字符串摘要=”;
使用(var hmacsha384=new hmacsha384(Encoding.Default.GetBytes(secretKey)))
{
byte[]hashmessage=hmacsha384.ComputeHash(Encoding.Default.GetBytes(prehashString));
bool大写=false;
StringBuilder结果=新的StringBuilder(hashmessage.Length*2);
for(int i=0;i
签名是:

let signature = `/api${apiPath}${nonce}${body ? JSON.stringify(body) : ''}`
因此,他们在nodejs示例中的
/api/rest/v1/private/wallets
apiPath
之前添加了
/api
,因此在这种情况下,签名将是(具有
nonce
1609874861073
):

所以

并将所有的
编码.Default
替换为
编码.UTF8
。他们不应该给你任何问题,但有问题就是有问题

下次,如果您的电脑上安装了nodejs,您可以在nodejs上尝试他们的代码,免费添加一些console.log,否则您可以在网站上尝试一些node.js代码(这就是我为解决您的问题所做的)。

签名是:

let signature = `/api${apiPath}${nonce}${body ? JSON.stringify(body) : ''}`
因此,他们在nodejs示例中的
/api/rest/v1/private/wallets
apiPath
之前添加了
/api
,因此在这种情况下,签名将是(具有
nonce
1609874861073
):

所以

并将所有的
编码.Default
替换为
编码.UTF8
。他们不应该给你任何问题,但有问题就是有问题


下次,如果你的电脑上安装了nodejs,你可以在nodejs上尝试他们的代码,免费添加一些console.log,否则你可以在网站上尝试一些node.js代码(这就是我为解决你的问题所做的)。

你不应该使用
编码。默认值
。我认为
crypto
的默认编码是utf8,因此
encoding.utf8
请参见以下内容:@xanatos我改为UTF-8。。不difference@jdweng-该链接正在对文件流进行签名,我正在尝试对请求进行签名您不需要将内容长度添加到请求中吗?client.contentlength不应使用
编码。默认值
。我认为
crypto
的默认编码是utf8,因此
encoding.utf8
请参见以下内容:@xanatos我改为UTF-8。。不difference@jdweng-该链接正在对文件流进行签名,我正在尝试对请求进行签名您不需要将内容长度添加到请求中吗?client.contentLength认为double/api是一个输入错误。。似乎现在能用了。。谢谢我认为double/api是一个打字错误。。似乎现在能用了。。谢谢
/api/api/rest/v1/private/wallets1609874861073
string prehashString = string.Concat("/api", requestPath, nonce.ToString(), body);