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
302 次每月下载
在 6 个 crate 中使用(5 个直接使用)
28KB
322 行
rust-oath
此库旨在提供符合 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