#public-key #zero-knowledge

no-std oberon

奥伯恩是一个多因素零知识令牌,无需电子邮件、短信或身份验证应用。令牌有效性的证明只有96字节,而令牌本身只有48字节。

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-pre32021年7月13日

#607 in 密码学

Download history 3/week @ 2024-03-08 2/week @ 2024-03-15 74/week @ 2024-03-29 15/week @ 2024-04-05

每月521次下载

Apache-2.0

63KB
1.5K SLoC

Crate Docs Apache 2.0

奥伯恩

一个简洁的零知识证明协议,使用类似于基于身份/属性签名的技术。

摘要:奥伯恩允许端点向消费者发行多因素令牌,消费者可以证明其有效性,而不必透露令牌本身,也不需要电子邮件、短信或身份验证应用。端点只需要存储一个公钥,而不需要任何令牌。如果攻击者入侵服务器,将无法获取任何密码/令牌文件来窃取,只能看到公钥。令牌有效性的证明只有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 端点使用。

三路模型

Three pass

一路模型

One pass

依赖关系

~2–11MB
~97K SLoC