5次发布
0.1.4 | 2024年2月12日 |
---|---|
0.1.3 | 2024年2月12日 |
0.1.2 | 2024年2月12日 |
0.1.1 | 2023年11月26日 |
0.1.0 | 2023年11月26日 |
#154 in 认证
1,385 每月下载
用于 4 个crate(2个直接)
70KB
1.5K SLoC
Futhark - Rust中的Runes实现
这是Rusty Russell原版Runes库的Rust实现。https://github.com/rustyrussell/runes.
什么是Runes?
Runes是可扩展的授权Cookies,类似于Macaroons https://research.google/pubs/pub41892/,但更简单。可扩展意味着拥有服务器颁发的Cookies的客户端可以推导出一个具有额外限制的Cookies,这些限制不能从推导出的Cookies中移除。然后这个Cookies可以被传递给其他方以在服务器上进行身份验证。
要了解更多关于Runes的动机,请查看原始仓库。
覆盖率和功能
此实现完全符合给定的测试向量集。然而,目前缺少对替代方案的函数值的清晰实现。这些将在未来的更新中包含。
- 符合测试向量
- 对值的函数检查
- 完整的crate文档
Runes语言
(有关深入解释,请参阅原始仓库)
Runes 是一组必须通过的 限制。一个 限制 由一个或多个 替代方案 组成,其中至少一个 替代方案 必须通过。
替代方案
一个 替代方案 是一个形式为(无空格)的字符串
ALTERNATIVE := FIELDNAME CONDITION VALUE
FIELDNAME
只包含UTF-8字符,不包括标点符号字符
! " # $ % & ' ( ) * +, - . / : ; < = > ? @ [ \ ] ^ _ \` { | } ~
尽管如此,标点符号字符可以出现在 VALUE
中,但 &
、|
和 \\
必须用 \
转义,因为这些用于分隔 替代方案 和 限制。
CONDITION
是以下值之一,具有相应的检查
CONDITION |
检查 |
---|---|
! |
字段缺失 |
= |
存在且完全等于 |
/ |
存在且不等于 |
^ |
存在且以...开始 |
$ |
存在且以...结束 |
~ |
存在且包含 |
< |
存在,是有效的整数(可能是符号整数),并且数值小于 |
> |
存在,是有效的整数(可能是符号整数),并且数值大于 |
{ |
存在且字典序小于(或更短) |
} |
存在且字典序大于(或更长) |
# |
注释(总是通过) |
限制
限制是一组通过逻辑“或”条件链接的备选方案,该条件由OR
表示,并用|
表示;限制之间由&
分隔。例如字符
cmd=foo|cmd=bar&subcmd!|subcmd={get
第一个限制要求cmd
为foo
或bar
,第二个限制要求subcmd
不存在,或者字典序小于(或更短)get
。
Rune 授权
每个rune都带有一个SHA-256
验证码,确保rune中不能被删除任何限制。每个authcode
的基础是一个秘密(小于56字节),只有发布rune的服务器才知道。
从这个authbase
开始,每个限制都被追加到一个rune上,并更新authcode
,假设秘密以相同的方式处理
- 按照SHA-256的要求填充限制(
authbase
的秘密)以使结果为64的倍数- 追加
0x80
。 - 追加
0
(使得结果为64的倍数)。 - 追加限制的大端64位位计数(len)。
- 追加
这样,authcode
总是SHA-256摘要。
然后通过向rune添加一个新的限制并更新authcode
来实现派生。
编码
字符是base64编码的(URL安全),从SHA-256 authcode
开始,然后是限制(一个或多个),用&
分隔。
更多
更多见解、附加信息和示例,请访问原始仓库https://github.com/rustyrussell/runes。
依赖项
~4.5–6.5MB
~119K SLoC