26个稳定版本 (3个主要版本)
3.5.1 | 2024年3月24日 |
---|---|
3.5.0 | 2023年5月5日 |
3.4.2 | 2022年9月11日 |
3.4.1 | 2022年7月10日 |
0.4.0 | 2020年10月3日 |
#37 在 身份验证
用于 2 crates
195KB
4.5K SLoC
ctap-hid-fido2
Rust FIDO2 CTAP库 (以及cli工具 ctapcli )。
使用符合FIDO2规范的安全密钥(例如Yubikey)进行身份验证是可能的。
功能
- 注册和身份验证。
- 注册或更改PIN。
- 指纹的注册和删除。
- 管理安全密钥中记录的凭证。
版本
Ver 3.5.1
- 依赖项更新。
Ver 3.5.0
- 在MakeCredentialArgsBuilder中指定多个key_types。
- 支持ED25519。
- 更新依赖项 → base64, x509-parser, hidapi, clap, env_logger
- 删除依赖项 → serde_json, ihex, base64-url
Ver 3.4.2
- 更新依赖项 → aes, cbc, x509-parser, rpassword
- 删除依赖项 → block-modes
Ver 3.4.1
- 错误修复
Ver 3.4.0
- 更新
MakeCredentialArgs
- 将
rkparam
改为user_entity
- 添加
resident_key
- 示例 → 可发现凭证/居民密钥
- 将
Ver 3.3.1
- 实现
Authenticator Confi
g -force_change_pin()
. → Authenticator Config(CTAP 2.1)
Ver 3.3.0
- 实现
Credential Blob Extension
. → 注册和身份验证示例
Ver 3.2.0
- 实现
Authenticator Config
-set_min_pin_length()
. → Authenticator Config(CTAP 2.1) - 实现
Set Min Pin Length Extension
. → 注册和身份验证示例 - 实现
大型Blob
→ 大型Blob(CTAP 2.1)
版本 3.1.0
- 实现
Authenticator 配置
-toggle_always_uv()
. → Authenticator 配置(CTAP 2.1) - 添加 CLI 工具 ctapcli
版本 3.0.0
- 用法从 Ver2. 变更。 → 如何使用。
如何使用注册和身份验证
use ctap_hid_fido2::{
fidokey::{GetAssertionArgsBuilder, MakeCredentialArgsBuilder},
verifier, Cfg, FidoKeyHidFactory,
};
fn main() {
let rpid = "reg-auth-example-app";
let pin = get_input_with_message("input PIN:");
println!("Register");
// create `challenge`
let challenge = verifier::create_challenge();
// create `MakeCredentialArgs`
let make_credential_args = MakeCredentialArgsBuilder::new(rpid, &challenge)
.pin(&pin)
.build();
// create `FidoKeyHid`
let device = FidoKeyHidFactory::create(&Cfg::init()).unwrap();
// get `Attestation` Object
let attestation = device
.make_credential_with_args(&make_credential_args)
.unwrap();
println!("- Register Success");
// verify `Attestation` Object
let verify_result = verifier::verify_attestation(rpid, &challenge, &attestation);
if !verify_result.is_success {
println!("- ! Verify Failed");
return;
}
// store Credential Id and Publickey
let userdata_credential_id = verify_result.credential_id;
let userdata_credential_public_key = verify_result.credential_public_key;
println!("Authenticate");
// create `challenge`
let challenge = verifier::create_challenge();
// create `GetAssertionArgs`
let get_assertion_args = GetAssertionArgsBuilder::new(rpid, &challenge)
.pin(&pin)
.credential_id(&userdata_credential_id)
.build();
// get `Assertion` Object
let assertions = device.get_assertion_with_args(&get_assertion_args).unwrap();
println!("- Authenticate Success");
// verify `Assertion` Object
if !verifier::verify_assertion(
rpid,
&userdata_credential_public_key,
&challenge,
&assertions[0],
) {
println!("- ! Verify Assertion Failed");
}
}
pub fn get_input() -> String {
let mut word = String::new();
std::io::stdin().read_line(&mut word).ok();
return word.trim().to_string();
}
pub fn get_input_with_message(message: &str) -> String {
println!("{}", message);
let input = get_input();
println!();
input
}
- 参见 [如何使用](#How to use) 和 示例 以获取详细说明。
描述
ctap-hid-fido2 是一个实现 CTAP 2.0 和 2.1 的 crate,允许直接控制符合 FIDO2 的身份验证器,如 Yubikey。
有关 FIDO 的更多信息,请参阅 FIDO 协会页面。
- 实现 FIDO2 CTAP 2.0 & 2.1 (HID)
- 客户端到身份验证器协议 (CTAP)
- 支持的 FIDO 密钥
- Yubikey 生物识别
- Yubikey
- FEITIAN ePass FIDO(A4B)
- FEITIAN BioPass K27 USB 安全密钥
- FEITIAN AllinPass FIDO2 K33
- SoloKey
- Nitrokey FIDO2
- OpenSK
- Idem Key
作者
gebo
构建和运行
macOS
使用它没有特别需要注意的事项。
Windows
- 以管理员身份运行
在 Windows 中,除非执行的可执行文件具有管理员权限,否则无法访问通过 HID 的安全密钥。
树莓派
- 安装
libusb
和libudev
软件包
(对于 Linux,如 Ubuntu,可能也如此)
如果您在 libusb-1.0 依赖项下遇到以下错误并且无法构建,您可以按照以下步骤解决问题。
sudo apt install -y libusb-1.0-0-dev libudev-dev
如何使用
必须设置 PIN
除非以下示例中另有说明,否则必须在身份验证器中设置 PIN。
创建 FidoKeyHid 对象
首先,使用 FidoKeyHidFactory::create
创建设备对象。
如果无法在 HID 设备上检测到身份验证器,则会导致错误。
use ctap_hid_fido2::{Cfg, FidoKeyHidFactory};
...
let device = match FidoKeyHidFactory::create(&Cfg::init()) {
Ok(d) => d,
Err(e) => {
println!("error: {:?}", e);
return;
}
};
如果检测到多个身份验证器,则会导致错误。有关 多身份验证器支持 的说明,请参见以下描述。
Cfg
使用 Cfg
的参数默认值,您可以使用 init()
创建,但您可以根据需要对其进行自定义以更改行为,请参阅 Cfg 定义。
FidoKeyHid
使用 FidoKeyHid
中实现的方法使用身份验证器。
例如,可以使用 get_pin_retries()
获取 PIN 重试次数。
match device.get_pin_retries() {
Ok(retry) => println!("{}", retry),
Err(e) => println!("error: {:?}", e),
}
多身份验证器支持
如果您连接到 HID 的多个身份验证器,并且想要单独控制每个设备,请使用 get_fidokey_devices()
和 create_by_params()
。
let devs = ctap_hid_fido2::get_fidokey_devices();
for dev in devs {
println!("- vid=0x{:04x} , pid=0x{:04x} , info={:?}",dev.vid, dev.pid, dev.info);
let fidokey = FidoKeyHidFactory::create_by_params(&vec![dev.param], &Cfg::init()).unwrap();
let info = fidokey.get_info().unwrap();
println!("{}", info);
}
示例
有关各种模式的示例,请参见以下链接。
CLI工具
可以使用CLI工具。
依赖
~11-20MB
~359K SLoC