25个不稳定版本 (10个破坏性版本)
0.12.0 | 2024年7月6日 |
---|---|
0.11.0 | 2024年2月13日 |
0.10.1 | 2024年2月6日 |
0.10.0 | 2023年11月10日 |
0.1.2 | 2021年3月27日 |
#72 in 认证
每月 1,232 次下载
185KB
3.5K SLoC
Scram-rs
v 0.12
SCRAM-SHA1、SCRAM-SHA256、SCRAM-SHA512、SCRAM-SHA256-PLUS客户端和服务器。
许可证
MPL-2.0
支持
- SHA-1散列器
- SHA-256散列器(与Postfix Dovecot SASL测试过)
- SHA-512散列器
- 客户端/服务器同步
- 服务器通道绑定256未测试(用户必须实现trait以提供必要的数据)
- 客户端通道绑定256未测试
- 支持异步,允许在异步代码中集成或使用异步
- 客户端/服务器密钥(自定义)
- 错误处理
server-error
RFC5802(《e=server-error-value》) - 动态服务器实例,即存储实例为dyn对象,而不是泛型结构体
- 使用借用或消耗实例初始化Scram客户端/服务器。
不支持
- authzid(a=)
- 通道绑定SHA-1不安全。
设计上未实现的功能
此crate不会为您打开远程连接到主机。它不包含打开任何远程目标连接的代码。此crate仅包含SCRAM-SHA逻辑。您的程序自行管理连接,自行接收数据并将其发送回客户端/服务器。此crate仅在接收到的数据上执行逻辑操作,并将结果返回给您的程序。这种方法提高了灵活性。此crate还实现了信号机制,因此不需要实现特殊的错误处理。
基于crate
- pbkdf2
- sha2
- sha-1
- hmac
- md-5
- base64
- getrandom
- ring
特性
默认情况下,以下crate:[pbkdf2]、[hmac]、[sha2]、[sha1]包含在此crate中,并提供trait对象。
use_ring
- 向crate添加[ring],并提供trait对象。
这两个功能不能同时使用。
警告
- 此软件包不会打开任何网络连接。绝对不能!
- 此软件包从未经过审计,只有静态测试证明了其操作的正确性。
- 此软件包使用未经验证的加密软件包。无法保证这些软件包始终正确运行。
本软件包的作者不对可能发生的一切负责。
问题跟踪器
使用方法
请参阅 ./examples/ 那里
基于测试的基准
scram_sha256_server() 同步/异步测试 (DEBUG)
迭代 | 使用默认值 | 使用环 |
---|---|---|
1 | 98.02ms | 16.96ms |
2 | 98.69ms | 16.52ms |
3 | 95.27ms | 16.04ms |
scram_sha256_works() 异步测试 (DEBUG)
迭代 | 使用默认值 | 使用环 |
---|---|---|
1 | 97.66ms | 16.15ms |
2 | 100.65ms | 15.98ms |
3 | 100.05ms | 17.12ms |
示例
初始化
通用结构(借用实例)
let authdb = AuthDB::new();
let scramtype = SCRAM_TYPES.get_scramtype("SCRAM-SHA-256").unwrap();
let mut server =
SyncScramServer::<ScramSha256RustNative, &AuthDB, &AuthDB>::new(&authdb, &authdb, ScramNonce::none(), scramtype).unwrap();
动态
let authdb = AuthDB::new();
let authdbcb = AuthDBCb{};
let scramtype = SCRAM_TYPES.get_scramtype("SCRAM-SHA-256").unwrap();
let server =
SyncScramServer
::<ScramSha256RustNative, AuthDB, AuthDBCb>
::new_variable(authdb, authdbcb, ScramNonce::none(), scramtype).unwrap();
let mut server_dyn = server.make_dyn();
自定义(消耗实例)
let authdb = AuthDB::new();
let conninst = ConnectionInst::new();
let scramtype = SCRAM_TYPES.get_scramtype("SCRAM-SHA-256").unwrap();
let mut server =
SyncScramServer
::<ScramSha256RustNative, AuthDB, ConnectionInst>
::new_variable(
authdb,
conninst,
ScramNonce::none(),
scramtype
)
.unwrap();
依赖项
~6–14MB
~263K SLoC