SwiftOTP
SwiftOTP 是一个用于生成一次性密码(OTP)的 Swift 库,常用于两步认证。SwiftOTP 支持基于 HMAC 的一次性密码(HOTP)和基于时间的一次性密码(TOTP),分别由 RFC 4226 和 RFC 6238 定义。
安装
CocoaPods
SwiftOTP 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中。
pod 'SwiftOTP'
然后在项目目录中运行 pod install
来安装。
Carthage
SwiftOTP 通过 Carthage 提供。要安装它,只需将以下行添加到您的 Cartfile 中。
github "lachlanbell/SwiftOTP"
然后在项目目录中运行 carthage update
,并将生成的框架添加到您的项目中。
Swift Package Manager
您可以使用 Swift Package Manager,并在 Package.swift
中通过添加以下内容来指定依赖项:
dependencies: [
.package(url: "https://github.com/lachlanbell/SwiftOTP.git", .upToNextMinor(from: "2.0.0"))
]
使用方法
TOTP(基于时间的单次密码)
TOTP对象的创建
let totp = TOTP(secret: data)
可以使用默认设置(6位数字,30秒时间间隔和采用HMAC-SHA-1)创建TOTP对象,如上图所示,也可以按照如下设置单独参数
let totp = TOTP(secret: data, digits: 6, timeInterval: 30, algorithm: .sha1)
生成TOTP密码
创建TOTP对象后,可以使用generate()
函数通过使用Date
对象或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)
}
注意:此函数只接受整数值,并且必须是正数。
HOTP (基于HMAC的一次性密码(基于计数器))
除了TOTP之外,SwiftOTP还支持基于计数器的HOTP密码生成。
HOTP对象的创建
let hotp = HOTP(secret: data)
HOTP对象可以以默认设置(6位数字,使用HMAC-SHA-1)创建,如上所示,也可以按照以下方式设置个别参数。
let hotp = HOTP(secret: data, digits: 6, algorithm: .sha1)
生成HOTP密码
创建HOTP对象后,可以使用generate()
函数通过计数器的值生成密码(其中hotp
是一个HOTP
对象)。
if let hotp = HOTP(secret: data) {
let otpString = hotp.generate(counter: 42)
}
Base32
大多数用于生成一次性密码的秘密密钥使用了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。
数字长度
根据 RFC 4226 规定,TOTP
和 HOTP
对象仅接受 6 到 8 位的数字长度值。如果提供了无效的数字长度值,则这两个对象都将为 nil
。
旧版本的 Swift
使用对应分支来使用旧版本的 Swift(4.0 及以上)。例如
pod 'SwiftOTP', :git => 'https://github.com/lachlanbell/SwiftOTP.git', :branch => 'swift-4.0'
许可证
SwiftOTP 可以在 MIT 许可证下使用。有关更多信息,请参阅 LICENSE 文件。
致谢
SwiftOTP 依赖于以下开源项目
- CryptoSwift by Marcin Krzyżanowski (License)
- Base32 by Norio Nomura (License)
密码生成代码的部分是从 旧的 Google Authenticator 源代码 中改编的。