豫言 / 豫言操作系统口令派生 @ 0.1.0

以 PBKDF2-HMAC-SHA-256 从口令与盐派生固定长度密钥。

源码浏览已生成;不能解析的文件以纯文本展示,不表示通过类型检查。

规范.汉语.md

# 口令派生接口规范 0.1.0

`派生PBKDF2SHA256十六进制` 按 RFC 8018 的 PBKDF2 计算,伪随机函数是 HMAC-SHA-256。参数依次是口令、盐和迭代次数:口令与盐都取字符串的原始 UTF-8 字节,盐是文字,不做十六进制解码;输出 32 字节,写成 64 个 ASCII 小写十六进制字符,不加前缀、分隔符或换行。

口令不得为空。迭代次数须为正整数;宿主可以设置上限,超过上限时调用失败,云工适配的上限是 100000(Cloudflare Workers 的 WebCrypto 限制)。空口令、迭代次数越界或宿主密码原语失败时,调用失败并抛出豫言异常。相同输入在所有宿主必须得到相同结果。

## 一致性样例

| 口令 | 盐 | 迭代次数 | 结果 |
| --- | --- | --- | --- |
| `password` | `salt` | 1 | `120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b` |
| `password` | `salt` | 2 | `ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43` |
| `password` | `salt` | 4096 | `c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a` |

## 边界

本包只做密钥派生,不替使用者选择盐、迭代次数或存储格式,也不提供常量时间比较;这些属于使用者。派生发生在宿主的原生代码里,应用不应在豫言中自行实现 PBKDF2,否则百万级哈希运算会超出 Worker 的 CPU 时限。

规范.文言.md

# 口令派生公约 0.1.0

`派生PBKDF2SHA256十六进制` 依 RFC 8018 之 PBKDF2 而算,伪随机之函为 HMAC-SHA-256。参依次为口令、盐、迭代之数:口令与盐皆取字符串之原 UTF-8 字节,盐乃文字,不作十六进制解;出三十二字节,书为六十四位 ASCII 小写十六进制,不加前缀、分隔与换行。

口令不得空。迭代之数须为正整数;宿主可设其上限,逾限则调用败。云工适配之上限为十万(Cloudflare Workers 之 WebCrypto 所限)。口令空、迭代越界或宿主密码原语败,则调用败而抛豫言之异。同入者,诸宿主必得同果。

## 一致之样

| 口令 | 盐 | 迭代之数 | 果 |
| --- | --- | --- | --- |
| `password` | `salt` | 1 | `120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b` |
| `password` | `salt` | 2 | `ae4d0c95af6b46d32d0adff928f06dd02a303f8ef3c251dfd6e2d85a95474c43` |
| `password` | `salt` | 4096 | `c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a` |

## 界

此包惟派生密钥,不代客择盐、迭代之数与存储之式,亦不供常量时间之较;此皆客所当为。派生行于宿主原生之码,客不当于豫言自造 PBKDF2,否则百万之哈希将逾 Worker 之 CPU 时限。