3 个版本 (稳定版)

使用旧的 Rust 2015

1.1.0 2020年3月18日
1.0.0 2017年12月17日
0.0.1 2017年12月10日

#537 in 身份验证

每月 35 次下载

Apache-2.0

24KB
404

pw 构建状态

pw 以无状态方式生成密码,类似于脑钱包。pw 提供了插入特殊字符、用于一次性垫模式、根据当前日期生成密码(适用于要求每 N 天重置密码的组织)或使用一些预共享密钥材料以及用户密钥生成密码的选项。所有这些选项都可以通过命令行访问,也可以通过配置文件,该配置文件可以通过原生 OS 密钥环加密。

安装

要使用 rust/cargo 的最新版本安装 pw,请执行:

cargo install pw

它还有一些其他依赖项,这些依赖项可能已在桌面系统上安装

  • dbus 在 Linux 上(Ubuntu 上的 libdbus-1-dev
  • gmp (Ubuntu 上的 libgmp-dev

分析

pw 使用 pbkdf2sha512 来拉伸密码,以提供的实体作为盐。结果以 base58 编码,这意味着密码中的每个符号都有 ~5.86 的熵。默认情况下,pw 生成长度为 20 的密码,因此每个(默认)密码大约有 ~117 比特熵。相比之下,“correct horse battery staple” 只有 44 比特。

密码轮换

改变密码,记忆性强。《pw》为给定盐和用户秘密组合生成密码提供了几个功能。例如,一些组织要求用户每90天更改密码。这是安全表演,但无论如何,用户必须合作。使用标准的密码生成器,用户可以无限期地将“2”和“3”(或“4”)添加到密码中;问题是这使某些明文输入的一部分变得已知。《pw》使用一种新颖的方法来改变基于此类输入的pbkdf2的迭代次数。--otp可以直接用来改变迭代次数,从而改变生成的密码。--period--date可以一起使用,以解决一些组织要求您每90天更改密码的问题。--period单独计算基于当前日期的密码,而--date允许您传递一个任意日期来计算密码。

添加特殊字符

默认情况下,base58编码仅包括字母数字字符。一些组织要求密码中包含特殊字符。用户可以通过向--special提供参数来添加任意特殊字符。默认情况下,--special包括25个通常允许的特殊字符。

盐推荐

盐对生成的密码非常重要。一个典型的建议是使用密码所属实体的域名,但问题是攻击者可能会偷取usbank.com的密码数据库,并只为usbank.com生成彩虹表。因此,建议使用一些个性化的盐版本。例如,我可能会选择tycho.usbank.com。一个额外的功能(在TODO中讨论)将是算法的全局偏移量,这样人们可以选择例如不使用默认的偏移量0,而为所有密码使用另一个值。

用法

pw支持通过--{get,set,delete}}-keyring-password将密码存储在操作系统原生密钥链中,这样用户不必在每次调用时输入密码。

还有Linux上的X11剪贴板支持,通过xclip,因此用户可以将--clipboard传递给pw,它将自动将生成的密码复制到剪贴板。

最后,值得一提的是,pw支持配置文件,允许一些其他功能,可以通过--{get,set,edit,delete}}-keyring-config进行配置。例如,用户可以存储OTP偏移量、特殊字符集,甚至用于生成特定密码的预共享密钥材料(配置键preshared,一个字符串)。目前此配置文件必须存储在密钥链中,因此不会暴露给未加密的访问。当然,这并不是无状态的,并且pw可以在没有此配置的情况下完全运行,但对于某些用户来说可能很有用。

待办事项

  • 加密配置文件。如果将配置文件放在您的密钥链中,这主要得到支持,所以不是优先级高的事情,尤其是在我没有看到真正的rust文件加密库的情况下。
  • --otp提供全局设置,以进一步阻止彩虹表

依赖关系

~14MB
~330K SLoC