Logo SwiftOTP

Build Status Version Carthage compatible License Platform Swift Version

SwiftOTP 是一个 Swift 库,用于生成一次性密码 (OTP),该密码通常用于双因素身份验证。 SwiftOTP 支持基于 HMAC 的一次性密码 (HOTP) 和基于时间的一次性密码 (TOTP),分别定义在 RFC 4226RFC 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: "3.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 对象后,可以使用 Date 对象或使用 generate() 函数的 Unix 时间值来生成某个时间点的密码

例如,要使用名为 totpTOTP 对象获取当前时间的密码

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 值,并且必须为正数。

HOTP(基于 HMAC 的一次性密码(基于计数器))

除了 TOTP 之外,SwiftOTP 还支持生成基于计数器的 HOTP 密码。

创建 HOTP 对象

let hotp = HOTP(secret: data)

可以使用默认设置(6 位数字,使用 HMAC-SHA-1)创建 HOTP 对象,如上所示,或者可以设置各个参数,如下所示

let hotp = HOTP(secret: data, digits: 6, algorithm: .sha1)

生成 HOTP 密码

创建 HOTP 对象后,可以使用 generate() 函数为计数器值 (UInt64) 生成密码,例如(其中 hotpHOTP 对象)

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。

数字长度

TOTPHOTP 对象都只接受 6 到 8 之间的数字长度值,如 RFC 4226 中所指定。 如果提供了无效的数字长度值,则两个对象都将为 nil

较旧的 Swift 版本

使用相应的分支来使用较旧的 Swift 版本(4.0 及更高版本)。 例如

pod 'SwiftOTP', :git => 'https://github.com/lachlanbell/SwiftOTP.git', :branch => 'swift-4.0'

许可证

SwiftOTP 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。

鸣谢

SwiftOTP 依赖于以下开源项目

密码生成器代码的某些部分改编自旧的 Google Authenticator 源代码