用于Swift中OAuth签名的HMAC-SHA1

时间:2015-09-04 13:04:13

标签: swift oauth sha1

我正在尝试在我的应用程序中为Swift 2制作OAuth模块。我坚持使用HMAC-SHA1签名生成,因为我的函数返回错误的base64 hmac-sha1进行签名。你能帮帮我吗?怎么了?

func URLEncodedKey() -> String? {   
    let key = "efgh"
    let string = "GET&http%3A%2F%2Fhost.net%2Fresource&name%3Dvalue%26name%3Dvalue%26oauth_consumer_key%3Dabcd%26oauth_nonce%3DxUwWEy3LVsI%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1441375089%26oauth_token%3Dijkl%26oauth_version%3D1.0"

    guard let keyData = key.dataUsingEncoding(NSUTF8StringEncoding),
        stringData = string.dataUsingEncoding(NSUTF8StringEncoding),
        outputData = NSMutableData(length: Int(CC_SHA1_DIGEST_LENGTH)) else {
            return nil
    }
    outputData.length = Int(CC_SHA1_DIGEST_LENGTH)

    CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1),
        keyData.bytes, keyData.length,
        stringData.bytes, stringData.length,
        outputData.mutableBytes)

    return outputData
        .base64EncodedStringWithOptions([])
}

用于检查:

String for encode: in code

Correct: O8UjUTYX1UxKF93KaY/mta9HETs=
My (incorrect): f5elSONqP6nPdpgBIyroJTCN19s=

正确的编码器在这里(javascript):https://oauth.googlecode.com/svn/code/javascript/example/signature.html

1 个答案:

答案 0 :(得分:3)

您的方法必须按原样返回正确的结果。

请参阅http://oauth.net/core/1.0/#signing_process

  

HMAC-SHA1签名方法使用[RFC2104]中定义的HMAC-SHA1签名算法,其中签名基本字符串是文本,key是连接值(每个参数编码首先编码) 消费者秘密和令牌密钥,由'&'字符(ASCII代码38)分隔,即使是空的。

在这种情况下,密钥应为"efgh&mnop"