#sasl #scram #client-server #mechanism #response #challenge

scram-rs

盐值挑战响应认证机制(SCRAM)SASL机制,实现SCRAM逻辑的库

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 认证

Download history 124/week @ 2024-07-02 18/week @ 2024-07-09

每月 1,232 次下载

MPL-2.0 许可证

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