SwiftOTP 是一个 Swift 库,用于生成一次性密码 (OTP),该密码通常用于双因素身份验证。 SwiftOTP 支持基于 HMAC 的一次性密码 (HOTP) 和基于时间的一次性密码 (TOTP),分别定义在 RFC 4226 和 RFC 6238 中。
SwiftOTP 可通过 CocoaPods 获得。 要安装它,只需将以下行添加到您的 Podfile 中
pod 'SwiftOTP'
然后在项目目录中运行 pod install
进行安装。
SwiftOTP 可通过 Carthage 获得。 要安装它,只需将以下行添加到您的 Cartfile 中
github "lachlanbell/SwiftOTP"
然后在项目目录中运行 carthage update
并将生成的框架添加到您的项目中。
您可以使用 Swift Package Manager 并在 Package.swift
中指定依赖项,方法是添加此内容
dependencies: [
.package(url: "https://github.com/lachlanbell/SwiftOTP.git", .upToNextMinor(from: "3.0.0"))
]
let totp = TOTP(secret: data)
可以使用默认设置(6 位数字,30 秒时间间隔并使用 HMAC-SHA-1)创建 TOTP 对象,如上所示,或者可以设置各个参数,如下所示
let totp = TOTP(secret: data, digits: 6, timeInterval: 30, algorithm: .sha1)
创建 TOTP 对象后,可以使用 Date
对象或使用 generate()
函数的 Unix 时间值来生成某个时间点的密码
例如,要使用名为 totp
的 TOTP
对象获取当前时间的密码
if let totp = TOTP(secret: data) {
let otpString = totp.generate(time: Date)
}
或者从 Unix 时间(即自 1970 年 1 月 1 日 00:00 UTC 以来经过的秒数)获取密码
if let totp = TOTP(secret: data) {
let otpString = totp.generate(secondsPast1970: 1234567890)
}
注意:此函数仅接受 Int
值,并且必须为正数。
除了 TOTP 之外,SwiftOTP 还支持生成基于计数器的 HOTP 密码。
let hotp = HOTP(secret: data)
可以使用默认设置(6 位数字,使用 HMAC-SHA-1)创建 HOTP 对象,如上所示,或者可以设置各个参数,如下所示
let hotp = HOTP(secret: data, digits: 6, algorithm: .sha1)
创建 HOTP 对象后,可以使用 generate()
函数为计数器值 (UInt64
) 生成密码,例如(其中 hotp
是 HOTP
对象)
if let hotp = HOTP(secret: data) {
let otpString = hotp.generate(counter: 42)
}
大多数用于生成一次性密码的密钥都使用 Base32 编码。 因此,SwiftOTP 包括一个 Base32 助手,用于将 Base32 字符串解码为 Data
。
例如
base32DecodeToData("ABCDEFGHIJKLMNOP")!
或在使用中
guard let data = base32DecodeToData("ABCDEFGHIJKLMNOP") else { return }
if let hotp = HOTP(secret: data) {
print(hotp.generate(42))
}
SwiftOTP 支持 RFC 4226 中指定的带有 SHA1 的 HMAC,以及 RFC 6238 中添加的 SHA256 和 SHA512。 由于 MD5 的哈希长度不足,因此**不支持** MD5。
TOTP
和 HOTP
对象都只接受 6 到 8 之间的数字长度值,如 RFC 4226 中所指定。 如果提供了无效的数字长度值,则两个对象都将为 nil
。
使用相应的分支来使用较旧的 Swift 版本(4.0 及更高版本)。 例如
pod 'SwiftOTP', :git => 'https://github.com/lachlanbell/SwiftOTP.git', :branch => 'swift-4.0'
SwiftOTP 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。
SwiftOTP 依赖于以下开源项目
密码生成器代码的某些部分改编自旧的 Google Authenticator 源代码。