难以翻译Python3将hotp / totp令牌代码转换为Swift3

时间:2017-07-20 00:36:22

标签: python swift security

最近我发现用Python 3编写的this awesome 2-factor authentication code generator。我试图将它转换为Swift 3,但我遇到了一个特定部分的问题,但是:

def get_hotp_token(secret, intervals_no):
    key = base64.b32decode(secret)
    msg = struct.pack(">Q", intervals_no)
    h = hmac.new(key, msg, hashlib.sha1).digest()
    o = h[19] & 15
    h = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
    return h

到目前为止,我只能使用here

中的代码执行函数体的第一行:p
func getHotpToken(secret: String) -> [Int] {
    let data = secret.base32DecodedData
    <...>
    return theTokens
}

我尝试阅读struct.pack here上的文档并阅读实际包装的内容here,但我仍然觉得这个概念/实现令人困惑,我不知道等价物是什么将在斯威夫特。

根据文档,struct.pack返回给定格式的字符串。我的格式是>Q,这意味着字节顺序为little-endian,C类型为unsigned long long。再说一遍,我不确定这应该如何看待Swift。

......那只是第二行!我真的不明白HMAC是如何工作的(我甚至找不到实际的'背景'代码),所以我甚至无法翻译整个函数。我找不到任何具有此行为的Swift本地库。

任何指针或帮助翻译此功能都将受到高度赞赏!

<子> P.S。我查了一下,我认为这是on topic

相关进口商品:

import base64, struct, hmac

1 个答案:

答案 0 :(得分:1)

我刚刚完成了将代码转换为Swift 3.这与Python版本略有不同,因为这更像是框架类型的东西。需要进行大量实验才能使get_hotp_token起作用(例如维基百科页面说它使用了SHA256,但它实际上使用了SHA1。

你可以找到它here

使用此功能时,请务必使用#import <CommonCrypto/CommonHMAC.h>

添加桥接标头

享受!