9个版本 (稳定版)
2.2.1 | 2023年6月6日 |
---|---|
2.1.0 | 2023年4月4日 |
2.0.0 | 2023年2月16日 |
1.3.0 | 2022年11月30日 |
1.0.0-pre3 | 2021年7月13日 |
#607 in 密码学
每月521次下载
63KB
1.5K SLoC
奥伯恩
一个简洁的零知识证明协议,使用类似于基于身份/属性签名的技术。
摘要:奥伯恩允许端点向消费者发行多因素令牌,消费者可以证明其有效性,而不必透露令牌本身,也不需要电子邮件、短信或身份验证应用。端点只需要存储一个公钥,而不需要任何令牌。如果攻击者入侵服务器,将无法获取任何密码/令牌文件来窃取,只能看到公钥。令牌有效性的证明只有96字节,而令牌本身只有48字节。发行方和验证服务器可以是不同的实体。
语言
奥伯恩由 Rust、Go、WebAssembly、PHP8、Python 和 C/C++ 通过 FFI 实现。
构建
Rust
cargo build --release
二进制文件在 target/release/liboberon.so
中创建
WebAssembly
wasm-pack build --target=web -- --features=wasm
PHP8
您必须安装 PHP8 才能完成构建。此存储库中的 Dockerfile
已经设置了必要的环境。
docker build -t oberon-php -f Dockerfile.php .
docker run --rm -v $PWD:/data -w /data -t oberon-php cargo build --release --features=php
Python
构建 Python 需要 Python 3.7 及以上版本和 maturin
maturin develop --cargo-extra-args="--features=python"
C/C++
要公开与 C/C++ 兼容的非杂名函数,请使用
cargo build --release --features=ffi
深入了解
密码学可以在 这里 找到
第一步需要生成密钥
可以使用分布式密钥生成方法生成密钥,但这超出了此包的范围。
可以将公钥提供给任何需要验证令牌和令牌证明的实体。
为需要认证的实体生成令牌。API 端点或用户可以是令牌持有者。
use oberon::*;
use rand::prelude::*;
fn main() {
let mut rng = thread_rng();
let sk = SecretKey::new(&mut rng);
let pk = PublicKey::from(&sk);
// identifier for a user
let id = b"[email protected]";
let token = Token::new(&sk, id).unwrap(); //only None if identifier yields invalid data
assert_eq!(token.verify(pk, id).unwrap_u8(), 1u8);
// Generated by the verifier
let nonce = b"123456789012345678901234567890";
// Token holder makes a proof, no blindings (more on that later)
let proof = Proof::new(&token, &[], id, nonce, &mut rng).unwrap(); // only None if identifier yields invalid data
// Verifier receives the proof
assert_eq!(proof.open(pk, id, nonce).unwrap_u8(), 1u8);
// Blindings can be applied to support multi-factor authentication and keeps the token from being stored in plaintext.
// Pin number
let b1 = Blinding::new(b"1234");
// HSM secret
let b2 = Blinding::new(b"0102d9d1-4777-40e4-9217-1e2d9591706c");
let blinding_token = token - b1;
let blinding_token = blinding_token - b2;
// Token holder makes a proof, with two blindings
let proof = Proof::new(&blinding_token, &[b1, b2], id, nonce, &mut rng).unwrap(); // only None if identifier yields invalid data
// Verifier receives the proof, no blindings required
assert_eq!(proof.open(pk, id, nonce).unwrap_u8(), 1u8);
}
协议可以用作三路模型,例如登录服务,或者单路模型用于 API 端点使用。
三路模型
一路模型
依赖关系
~2–11MB
~97K SLoC