2

我正在研究如何将 PAM 模块设计为我自己的 JAAS LoginModule 的指南。令我惊讶的一件事是,尽管用于访问散列密码的方法大多与散列方法本身正交,但我无法找到任何可以充分利用此属性的 PAM 模块。是因为我忽略了一些安全问题,还是只是一些尚未探索的问题?

为了进一步解释我的意思,假设我们有 3 种不同的方法来访问散列密码(LDAP、SQL、普通文件)和 2 种散列方法(MD5、SHA1)。目前,每种访问方法都有一个或多个 PAM 模块,每个模块都实现一种或多种这些散列方法。添加新的哈希方法(比如 BCrypt)意味着所有这些访问方法都需要修改以支持新的哈希类型。更好的设计是为每种访问方法使用一个 PAM 模块,使用用户名简单地检索散列密码,然后使用一组单独的 PAM 模块进行散列验证,并在模块之间共享散列值(如密码是)。因此,如果我使用数据库存储密码,并使用 MD5 验证密码,我的配置将如下所示:

password  required  pam_sql.so
password  required  pam_md5.so

在此配置中,pam_sql 从数据库中检索散列密码(如果用户名不存在,则失败)。然后 pam_md5 将散列密码与要测试的密码进行比较,如果不匹配则失败。在使用 Bcrypt 的不同配置中,我只需将 pam_md5 替换为 pam_bcrypt,而无需等待 pam_sql 的开发人员将其更新为新的哈希方法。

4

1 回答 1

1

PAM 不了解密码散列或比较密码的方法(无论是否散列)。PAM 为模块提供了与用户进行“对话”的设施,即向他们提问并从他们那里得到答案。常见的问题当然是“你的用户名是什么?” 和“你的密码是什么?”,但它们不必是。对于所有 PAM 关心,某些模块可能会在决定身份验证过程的结果之前询问用户 5 个问题或一个问题。

您要求的是比 PAM 更低层的抽象,它为处理散列密码的 PAM 模块子集提供通用服务。

你有什么问题?您想实现这样的抽象并将其作为标准进行推广吗?

于 2012-06-10T15:22:23.863 回答