Kraken EAPI:密钥无效

时间:2017-05-01 15:51:08

标签: swift cryptography

我正在尝试使用swift做一个客户端但是我无法与私人api通信{"错误":[" EAPI:无效密钥"]}

我使用CCHmac函数并尝试查看不同的api实现。 我什么都搞错了...... 这是我的代码:

 func getTradeBalance(basedAsset: String, completionBlock: @escaping BlockResult) {
    guard let url = URL(string: "\(krakenUtils.rootUrl)/\(krakenUtils.version)/private/Balance") else {
        return
    }
    let nonce: String = String(Int(Date().timeIntervalSince1970.rounded()))

    let path = "/\(krakenUtils.version)/private/Balance"
    let pubKey = krakenUtils.publicKey

    let params = ["nonce": nonce]

    //Sign = HMAC-SHA512 of URI + SHA256-POSTDATAS + base64decodedSecret


    let sign = getMessageSignature(path: path,
        nonce: nonce)

    Alamofire.request(url, method: .post,
                      parameters: params, encoding: JSONEncoding.default,
                      headers: ["API-Key": pubKey,
                                "API-Sign": sign])
        .responseJSON { resp in
            let result = self.handleResponse(result: resp)
            guard let json = result.0 else {
                completionBlock(nil, result.1)
                return
            }
            print(json)
    }

}

private func getMessageSignature(path: String, nonce: String) -> String {
    let secretDecoded = Data(base64Encoded: krakenUtils.privateKey, options: Data.Base64DecodingOptions.init(rawValue: 0))!
    let np = (nonce + "nonce=" + nonce).sha256().data(using: .utf8, allowLossyConversion: false)!
    var pathNP = path.data(using: .utf8, allowLossyConversion: false)!
    pathNP.append(contentsOf: np)

    let lRet = HMAC.sign(data: pathNP, algorithm: .sha512, key: secretDecoded).base64EncodedString()
    return lRet
}

 public static func sign(data: Data, algorithm: Algorithm, key: Data) -> Data {
    let signature = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: algorithm.digestLength)

    data.withUnsafeBytes { dataBytes in
        key.withUnsafeBytes { keyBytes in
            CCHmac(algorithm.algorithm, keyBytes, key.count, dataBytes, data.count, signature)
        }
    }

    return Data(bytes: signature, count: algorithm.digestLength)
}

这是经过身份验证的调用HTTPS标头的指南:

API-Key = API key
API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key

这是经过身份验证的呼叫POST数据的指南:

nonce = always increasing unsigned 64 bit integer
otp = two-factor password (if two-factor enabled, otherwise not required)

1 个答案:

答案 0 :(得分:2)

对于API-Key,您使用krakenUtils.publicKey。这个名字暗示你使用了一些公钥(不知道你在哪里得到它) 但是,这应该是您的个人API密钥。您可以在海妖站点(使用您的帐户登录)获取它并创建API密钥。您还可以在此处获取API代码。他们一起成为一对