You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Deribit FIX API使用QuickFIX登录报无效凭证 疑似nonce配置问题

问题排查结果
  • 核心错误:SHA256输出处理不符合要求
    你当前实现的sha256函数返回的是哈希值的十六进制可读字符串(长度64字节),但Deribit要求的是对SHA256输出的原始32字节二进制哈希值直接做Base64编码,而非对十六进制字符串编码。两者输出结果完全不同,是导致密码校验失败的主要原因。
  • 错误2:Nonce使用固定值
    文档要求nonce为每次登录生成的16~32字节随机值,你使用固定字符串作为nonce会触发服务端重放保护校验,直接返回凭证无效。
  • 可选校验项:系统时间同步
    请确保运行代码的设备时间通过NTP同步,时间戳与Deribit服务器误差超过1s也会导致校验失败。
修复代码示例

首先修改SHA256函数,返回原始二进制哈希值:

// 修改后:返回SHA256原始32字节二进制结果,而非十六进制字符串
string sha256_raw(const string str)
{
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, str.c_str(), str.size());
    SHA256_Final(hash, &sha256);
    // 直接返回二进制数据,不要转十六进制
    return string((char*)hash, SHA256_DIGEST_LENGTH);
}

修改登录逻辑,生成随机nonce:

string user = settings->get().getString("Username");
message.setField(Username(user));
string secret = settings->get().getString("Password"); // 存储Deribit下发的API Secret
// 生成16字节安全随机nonce
unsigned char nonce_buf[16];
RAND_bytes(nonce_buf, 16); // 可替换为其他安全随机源实现
string nonce_raw((char*)nonce_buf, 16);
string nonce_b64 = base64_encode(nonce_raw);
// 生成时间戳
milliseconds ms = duration_cast< milliseconds >(
        system_clock::now().time_since_epoch()
);
long long millis = ms.count();
string raw = to_string(millis) + "." + nonce_b64;
message.setField(RawData(raw));
// 生成符合要求的密码
string hash_raw = sha256_raw(raw + secret);
string password = base64_encode(hash_raw);
message.setField(Password(password));

内容的提问来源于stack exchange,提问作者nik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:27:02