#hotp #totp #questions #ocra

oath

Rust 中 OATH 算法的实现。包括 TOTP、HOTP 和 OCRA。

8 个版本

使用旧的 Rust 2015

0.10.2 2017 年 6 月 4 日
0.10.1 2017 年 5 月 26 日
0.1.4 2015 年 11 月 28 日
0.1.3 2015 年 3 月 28 日
0.0.3 2015 年 3 月 2 日

密码学 中排名 765

Download history 13/week @ 2024-01-01 42/week @ 2024-01-08 39/week @ 2024-01-15 26/week @ 2024-01-22 23/week @ 2024-01-29 24/week @ 2024-02-05 53/week @ 2024-02-12 44/week @ 2024-02-19 74/week @ 2024-02-26 63/week @ 2024-03-04 64/week @ 2024-03-11 64/week @ 2024-03-18 59/week @ 2024-03-25 112/week @ 2024-04-01 56/week @ 2024-04-08 65/week @ 2024-04-15

302 次每月下载
6 crate 中使用(5 个直接使用)

MIT 许可证

28KB
322

rust-oath

Build Status oath on crates.io Documentation MIT license

此库旨在提供符合 RFC 的 HOTP、TOTP 和 OCRA 的实现。

已实现

警告ieee754 出现问题时,RAMP 将无法编译。OCRA 数字问题模式不能使用长整型,被迫使用 u64。这种数据类型导致我们面临问题长度的限制:19 个符号。数字必须适合 u64。对于默认挑战格式(N08),这已经足够了。

示例

HOTP

extern crate oath;

use oath::hotp;

fn main () {
    assert_eq!(hotp("ff", 23, 6).unwrap(), 330795);
}

TOTP

以下所有时间都是以秒为单位的。

extern crate oath;

use oath::{totp_raw_now, HashType};

fn main () {
    // Return value differs every 30 seconds.
    totp_raw_now(b"12345678901234567890", 6, 0, 30, &HashType::SHA1);
}

OCRA

extern crate oath;

use oath::ocra;

let NULL: &[u8] = &[];
let STANDARD_KEY_20: &[u8] = &[0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30,
                               0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30];
let STANDARD_KEY_32 = "12345678901234567890123456789012".as_bytes();
let STANDARD_KEY_64 = "1234567890123456789012345678901234567890123456789012345678901234".as_bytes();
let PIN_1234_SHA1: &[u8] = &[0x71, 0x10, 0xed, 0xa4, 0xd0, 0x9e, 0x06, 0x2a, 0xa5, 0xe4,
                             0xa3, 0x90, 0xb0, 0xa5, 0x72, 0xac, 0x0d, 0x2c, 0x02, 0x20];

let suite = "OCRA-1:HOTP-SHA1-6:QN08";
let result = ocra(&suite, &STANDARD_KEY_20, 0, "00000000", NULL, NULL, 0)
assert_eq!(result, Ok(237653));

// Attention! PIN must be already hashed!
let suite_c = "OCRA-1:HOTP-SHA256-8:C-QN08-PSHA1";
let result_c = ocra(&suite_c, &STANDARD_KEY_32, 8, "12345678", PIN_1234_SHA1, NULL, 0);
assert_eq!(result_c, Ok(75011558));

let suite_t = "OCRA-1:HOTP-SHA512-8:QN08-T1M";
let t = 1_206_446_760; // UTC time in seconds
let result_t = ocra(&suite, &STANDARD_KEY_64, 18, "22222222", NULL, NULL, t);
assert_eq!(result_t, Ok(22048402));

Google Authenticator

Google 提供的密钥使用 base32 编码。您需要将它们转换为十六进制格式,然后才能传递给此 crate 中的任何函数。

这可以通过使用 base32 crate 来完成。

// assuming AAAAAAAAAAAAAAAA is your key
base32::decode(base32::Alphabet::RFC4648 {padding: false}, "AAAAAAAAAAAAAAAA").unwrap().as_ref()

然后将该结果作为密钥参数传递给 HOTP 和 TOTP 函数。

其他

如果您不想使用其他 crate 进行十六进制转换,此库提供了一个方便的函数 from_hex()。这有助于处理期望字节数组的函数。

let seed = oath::from_hex("ff").unwrap();
totp_raw(seed.as_slice(), 6, 0, 30);

许可

此库根据 MIT 许可证授权。如果您是潜在用户或当前用户,并且此许可证给您带来了问题,我愿意考虑多许可。

依赖关系

~665KB
~14K SLoC