#client-server #workflow #srp #key #salt #wraps

easy-srp

easy-srp将rust srp crate封装起来,提供了一个易于使用的API

1个不稳定版本

0.1.0 2024年8月26日

706密码学 中排名

Download history 47/week @ 2024-08-20

每月下载量59

BSD-3-Clause

26KB
389

为易于使用而封装了srp的crate

概述

srp crate提供了使用SRP6a认证的方法。此crate封装了srp crate,使认证工作流程更易于使用。

这是通过以下方式实现的

  • 提供用于3种典型工作流程的Workflow结构体
    • 生成初始注册数据
    • 客户端认证
    • 服务器认证
  • 命名方法step#,编号递增,因此可以清楚地知道在认证的哪个阶段需要调用该方法。
  • 包括自动随机值生成(用于临时密钥和盐)

特性

  • 通过WebAssembly支持Web。因此,此crate可以与基于WASM的web-UI框架(如yew)一起使用。
  • 易于使用。

可用的rust/cargo features

  • client:包含客户端类(ClientAuthenticationWorkflowClientRegistrationWorkflow等)。
  • server:包含服务器类(ServerAuthenticationWorkflow等)。
  • base64:包含base64 crate并提供对各种字节数组的base64序列化。
  • serialization:包含serde crate并向各种结构体添加SerializeDeserialize。这也启用了base64特性。
  • js:此crate使用getrandom crate生成随机数(盐、客户端/服务器临时密钥)。getrandom支持多种平台,包括Web浏览器(在WebAssembly中)。如果在浏览器中使用了easy-srp,请使用js特性,使getrandom使用JavaScript方法Crypto.getRandomValues()生成随机数。

用法

SRP6a 协议

用户注册

  1. 用户输入 用户名密码
  2. 客户端生成随机的 盐值
  3. 客户端从上述凭据计算出 验证器
  4. 客户端通过安全通道将 用户名盐值验证器 发送到服务器。
  5. 服务器存储这三个凭据。

用户认证

客户端 服务器
(用户名,pub_a) ->
<- (盐值,pub_b)
(proof_a) ->
<- (proof_b)
  1. 客户端将 (username, pub_a) 发送到服务器。
  2. 服务器查找 (salt, verifier)
  3. 服务器计算一个临时的私有密钥 b 并推导出其公钥 pub_b
  4. 服务器将 (salt, pub_b) 发送给客户端。
  5. 客户端计算证明 proof_a 并将其发送到服务器。
  6. 服务器验证 proof_a
  7. 服务器计算自己的证明 proof_b 并将其发送给客户端
  8. 客户端验证 proof_b
  9. 现在双方都可以计算一个共同的密钥。密钥的大小取决于使用的摘要,例如 SHA256 的 256 位(32 字节)。

生成客户端注册数据

客户端示例

服务器示例

依赖项

以下依赖项是故意包含的(即直接)

可能还有其他依赖项是间接包含的。

依赖项

~1–1.6MB
~33K SLoC