最近我发现用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
中的代码执行函数体的第一行:pfunc 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
答案 0 :(得分:1)
我刚刚完成了将代码转换为Swift 3.这与Python版本略有不同,因为这更像是框架类型的东西。需要进行大量实验才能使get_hotp_token
起作用(例如维基百科页面说它使用了SHA256,但它实际上使用了SHA1。
你可以找到它here。
使用此功能时,请务必使用#import <CommonCrypto/CommonHMAC.h>
享受!