AegixPass V2 是一种确定性派生密码生成算法,其输出只依赖于输入的主密码、区分密钥和预设配置。相同输入、相同预设和相同实现版本必须生成相同输出。所有文本输入与文件内容均按 UTF-8 处理。
其主要特点和设计原则如下:
算法的运作依赖于以下三个核心输入:
password_source)用户持有的核心秘密,程序永不存储。
distinguish_key)用于为不同服务(如网站域名或应用名称)生成不同密码的变量,作为区分生成结果的盐值。
preset)一个 JSON 对象,定义了密码生成的所有参数。其结构如下:
{
"name": "AegixPass - Default",
"version": 2,
"fastHashAlgorithm": "sha256",
"slowHashAlgorithm": "argon2id",
"rngAlgorithm": "chaCha20",
"length": 16,
"platformId": "aegixpass.takuron.com",
"charsets": [
"0123456789",
"abcdefghijklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
"!@#$%^&*_+-="
]
}
name: 预设名称,仅用于展示或识别。version: 算法的版本,V2 固定为 2。fastHashAlgorithm: 快哈希算法,用于预处理 platformId 和 password_source。slowHashAlgorithm: 慢哈希/密钥派生算法,用于生成 32 字节主种子。rngAlgorithm: 确定性随机序列算法,用于从主种子生成字符选择序列。length: 密码总长度,按 Unicode 标量值字符数计算。platformId: 平台 ID;参与慢哈希输入,同时经快哈希后作为慢哈希的盐值(即初始偏移量)。charsets: 字符集分组;最终密码保证每个分组至少出现 1 个字符。密码的生成过程严格遵循以下几个关键阶段:
在开始计算前,程序会进行严格的输入检查,以避免产生不安全或无效的结果。
password_source) 和区分密钥 (distinguish_key) 均不为空。version 必须为 2。length) 必须大于或等于字符集分组的数量 (charsets.length)。charsets 中每个字符串都至少包含一个字符(不能为空)。主种子生成是 V2 的核心:先用快哈希预处理关键输入,再用慢哈希生成固定长度种子。
fastHashAlgorithm:fast_hashed_salt = FastHash(platformId):得到 32 字节二进制值,用作后续慢哈希的盐值(即初始偏移量)。fast_hashed_password = FastHash(password_source)fast_hashed_password_hex = LowerHex(fast_hashed_password):转换为 64 个字符的小写十六进制字符串(格式必须使用小写字母,每个字节占两位,例如 {:02x})。"AegixPass_V{version}:{platformId}:{length}:{fast_hashed_password_hex}:{distinguish_key}:{charsets_json}"charsets_json 必须由标准 JSON 序列化得到(例如 ["0123456789","abcdefghijklmnopqrstuvwxyz"]),不添加额外空格。这里的 {platformId} 是原始字符串。slowHashAlgorithm 生成 32 字节的 master_seed。fast_hashed_salt(即 FastHash(platformId))直接作为慢哈希算法的盐值(salt/offset)。使用 master_seed 创建预设指定的确定性 RNG(如 ChaCha20)。不引入额外的随机 nonce 或系统随机数。随后按 charsets 数组顺序遍历每个分组:
[0, chars.len()) 范围内的索引。若此时密码数组的长度仍小于用户指定的 length:
charsets 原始顺序拼接所有字符集,形成合并字符池。池中的重复字符会提高该字符被抽中的权重,这属于预期的确定性行为,不能去重。length。每次抽取都继续使用阶段 C 中同一个 RNG 实例和无偏范围随机数生成逻辑。为了消除阶段 C 中引入的、保证性字符位置的任何可预测性,需要对整个密码数组进行最后一次确定性的 Fisher-Yates 洗牌。
i(从 len - 1 递减到 1),使用无偏范围随机数(拒绝采样)生成一个 [0, i] 范围内的随机索引 j,然后交换位置 i 和 j 的字符。将最终洗牌后的字符数组组合成一个字符串,并返回给用户。
master_seed 初始化。阶段 C、D、E 必须共享同一个 RNG 实例,绝对不能分别重新初始化。为保证跨平台兼容性,V2 针对不同环境的密码学依赖能力,定义了“必选实现”和“可选实现”:
所有兼容 V2 的实现都应支持:
sha256, sha3_256argon2idchaCha20以下算法可以由实现方按需支持。若不支持,应在解析预设或执行算法前返回明确错误,绝不能静默回退:
blake3scrypthc128通过以上步骤,AegixPass V2 算法确保了在任何兼容的实现上,只要输入完全一致,输出的密码也必然完全相同,同时提供高强度的安全保障。