背景:我编写了一个密码生成器,其工作方式如下:
- 生成130个随机比特
- 将随机比特解释为
GF(32)
的26个元素 - 使用元素作为系数构建25次多项式
- 计算所有32个可能输入的多项式
- 使用修改后的base32编码对结果进行编码
这给了我强密码(130位熵),在输入密码时可以容忍一些拼写错误,而不会影响安全性。
到目前为止,我已经将算法的纠错部分与ssh-add
命令集成在一起,这是完美无瑕的。现在我希望我的登录密码也能同样流畅地使用。
问题:是否可以编写一个pam
模块,在其他模块看到之前修改用户输入的密码?特别是,我想确保ecryptfs
看到正确的密码,以便在我的算法纠正了用户输入的密码中的错字后,可以挂载主目录。
作为一个单独的模块,没有明显的方法可以做到这一点。但这可以通过对pam_unix
模块的简单修改来完成。
在modules/pam_unix/pam_unix_auth.c
中pam_sm_authenticate()
的末尾可以找到以下代码:
/* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
name = p = NULL;
这可以修改为应用我需要的错误纠正:
/* verify the password of this user */
retval = _unix_verify_password(pamh, name, p, ctrl);
if (retval == PAM_AUTH_ERR) {
apply_error_correction(p);
retval = _unix_verify_password(pamh, name, p, ctrl);
}
name = p = NULL;