Swift:HMAC SHA-512用于coinpot API

时间:2018-01-15 21:58:39

标签: swift api hmac

我正在尝试连接到coinpot API,它有非常伪劣的文档。链接如下:

https://www.coinspot.com.au/api

它需要HMAC SHA512哈希附加到用户的密钥,然后是随机数密钥在POST请求的参数中,时间戳变为整数,以便在每个请求时保持唯一。标头需要API密钥和签名。

我通过coinpot的私有API网址https://www.coinspot.com.au/api

使用Alamofire的JSON编码发布请求

似乎我收到了成功的连接消息,但获得了{status = invalid;}响应。

我能想到的唯一两件事就是错误的POST请求(看起来似乎并非如此,好像我没有在参数中添加nonce键,我得到了正确的响应请求一个来自服务器)和HMAC SHA-512哈希。我已经从中获取了代码 HMAC SHA512 using CommonCrypto in Swift 3.1

稍微修改它以包含SHA512散列。

以下代码:

}}

CommonCrypto库已正确添加了objectiveC桥接文件,打印结果为我提供了正确的散列签名。

我已经联系了coinpot,但是他们满足了请求,并且他们只对API的任何技术支持提供了Cookie模板响应。

这是我在一个函数下放置的Alamofire段,以便向coinpot服务器调用任何命令:

extension String{

    var sha512:String{
         return HMAC.hash(inp: self, algo: HMACAlgo.SHA512)
    }
}

public struct HMAC{

    static  func hash(inp: String, algo: HMACAlgo)->String{
        if  let stringData = inp.data(using: String.Encoding.utf8, allowLossyConversion: false){
            return hexStringFromData(input: digest(input: stringData as NSData, algo: algo))
        }
        return ""
    }

    private  static  func digest(input: NSData, algo: HMACAlgo)-> NSData{
        let digestLength = algo.digestLength()
        var hash = [UInt8](repeating: 0, count: digestLength)
        CC_SHA512(input.bytes, UInt32(input.length), &hash)
        return  NSData(bytes: hash, length: digestLength)
    }

    private  static  func hexStringFromData(input: NSData)-> String{
        var bytes = [UInt8](repeating: 0, count: input.length)
        input.getBytes(&bytes, length: input.length)
        var hexString = ""
        for byte in bytes{
            hexString += String(format: "%02x", UInt8(byte))
        }
        return hexString
    }
}

enum HMACAlgo{
    case SHA512

    func digestLength()->Int{
        var result:CInt = 0
        switch self{
        case .SHA512:
            result = CC_SHA512_DIGEST_LENGTH
        }
        return Int(result)
    }
}

我认为以上是正确的。路由器只是一组地址,它们调用正确的POST请求来检索数据。

最后,我已将请求更改为GET,删除了标头和参数,并且我获得了状态正常和生成的JSON。我想我只是在浏览器上尝试一个命令就可以了,

API确实说每个请求都必须是post方法。

1 个答案:

答案 0 :(得分:0)

Coinspot API已关闭,没有ETA:Coinbase API down

我继续从我提出的任何请求中收到{'status': 'invalid'}

尽管只适用于BTC,LTC和DOGE,但他们的公开仍然存在。

def get_latest_price():
   r = requests.get("https://www.coinspot.com.au/pubapi/latest").json()
   print(r)