SwiftOTP 3.0.0

SwiftOTP 3.0.0

Lachlan Bell 维护。



SwiftOTP 3.0.0

  • lachlanbell

Logo SwiftOTP

Build Status Version Carthage compatible License Platform Swift Version

SwiftOTP 是一个用于生成一次性密码(OTP)的 Swift 库,常用于两步认证。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: "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 规定,TOTPHOTP 对象仅接受 6 到 8 位的数字长度值。如果提供了无效的数字长度值,则这两个对象都将为 nil

旧版本的 Swift

使用对应分支来使用旧版本的 Swift(4.0 及以上)。例如

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

许可证

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

致谢

SwiftOTP 依赖于以下开源项目

密码生成代码的部分是从 旧的 Google Authenticator 源代码 中改编的。