18次发布
0.12.1 | 2021年2月15日 |
---|---|
0.12.0 | 2020年9月10日 |
0.11.0 | 2020年8月7日 |
0.10.1 | 2020年3月20日 |
0.3.1 | 2017年6月16日 |
#643 in 密码学
每月62次下载
69KB
1K SLoC
websession.rs
Rust的Web会话支持
概述
websession
提供了一个简单的Web会话管理接口,具有可靠的加密密码(目前为bcrypt
)和会话标识符,这些标识符在活动或超时后自动续订,并在非活动时过期。
用户可以由任何有效的UTF-8标识,包括用户名、电子邮件地址、数字或几乎任何其他您能想到的东西。然而,FileBackingStore
和MemoryBackingStore
都默默地用"\u{FFFD}"替换"\n",就像String::from_utf8_lossy
对无效的UTF-8所做的那样。(这不太可能在生产环境中引起问题,因为名字中嵌入换行符的用户可能根本无法正确登录。)
预期元数据(真实姓名、联系信息、基于用户的权限等)将由使用websession
的应用程序进行管理。
用法
要使用此软件,您需要选择一个BackingStore
实现。
FileBackingStore
需要一个包含标识符和密码的现有文件。至少,您可以从一个空文件开始,然后向其中添加用户。此文件通常在运行之间持续存在,并且假定实现具有适当的读写权限。[所提供的实现尽力确保内容尽快写入磁盘。]
后端存储库旨在通过一个Authenticator
进行访问。
请参阅lib.rs
中的测试和示例,因为它们会被编写。(目前请参阅examples.md
。)
- 在0.12.1中,
FileBackingStore
使用的默认bcrypt
轮数从8更改为10。FileBackingStore::new_with_cost
允许您为您的特定系统选择轮数。下面将提供有关如何选择适当轮数的指导。
如果您使用MemoryBackingStore
,凭证不会在重启后持续存在。
实现说明
BackingStore
特性的实现负责适当地管理密码,尤其是不要以明文形式存储它们。提供的实现不会将明文密码存储在磁盘上,除非它们被故意滥用。[并未努力防止未加密密码泄露到交换空间,但欢迎降低这种泄露概率的拉取请求。]
特别地,当实现可以检测到提供给预期加密凭据的方法的未加密凭据时,应使用 BackingStoreError::InvalidCredentials
。
为实现 FileBackingStore
的文件提供了一些保护措施,即在重写时复制现有文件的模式,但这仅在类UNIX操作系统上实现。在Windows上尝试保留权限,但尚未经过严格测试。
bcrypt
备注
默认实现使用十轮(10轮)的 bcrypt
。您应运行 cargo bench
来查看在您的目标系统上运行 bcrypt
需要多少时间。如果10轮每迭代小于0.01秒(10,000,000纳秒)或大于0.25秒(250,000,000纳秒),则应
- 实现自己的
BackingStore
,其中使用更多或更少的轮数,根据需要 - 实现自己的
BackingStore
,其中使用更合适的加密方法 - 使用
FileBackingStore::new_with_cost
而不是FileBackingStore::new
并指定一个合适的值
每增加一轮,计算时间加倍,因此成本增加2将使每哈希时间增加4倍,成本减少2将使每哈希时间减少到原来的1/4
选择轮数(或接受默认值)后,它将持久化生成的密码,即使底层默认值更改(如 pwhash
1.0 和 websession
0.12.1 中的情况)。现有密码将继续使用旧值,直到它们被作废。但是,新密码将使用新值。
作为数据点,在轻负载的Linux系统上
CPU | 轮数 | 频率 | 模式 | 每迭代纳秒数 |
---|---|---|---|---|
Core 2 Duo T9300 | : 8 : | 2.50 GHz | 32位 | 20,881,257 (± 247,164) |
Core i7-4770L | : 8 : | 3.50 GHz | 64位 | 13,961,105 (± 202,267) |
Core i7-4770L | : 10 : | 3.50 GHz | 64位 | 55,161,654 (± 678,113) |
在上述Core 2 Duo T9300上,7轮将足够,而8轮对于Core i7-4770L是合理的。如上所述,10轮完成时间大约是8轮的4倍,有些过多。
(欢迎提供更多数据点。)
许可
本软件采用Apache和MIT双许可。
依赖关系
~1.8–2.4MB
~38K SLoC