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
相关产品推荐
相关产品推荐

