【问题标题】:Java and KerberosJava 和 Kerberos
【发布时间】:2010-09-28 12:02:44
【问题描述】:

我想将一个字符串与当前经过身份验证的用户的密码进行比较(加密密钥比较)。似乎从票证缓存中检索密码,但我该怎么做?

谢谢

【问题讨论】:

    标签: java passwords kerberos


    【解决方案1】:

    无法从客户端或 kerberos 系统中任何地方的可用信息中检索密码。根据kerberos article in wikipedia(它包含与我在其他来源阅读的信息相似的信息),用户输入的密码通过单向函数被散列为从此时起用作秘密的东西。该密钥可在密钥分发中心 (KDC) 获得,并且授予票证 (TGT) 使用此密钥进行对称加密。要接收和使用 TGT,客户端必须提供解密包的秘密——这是通过向用户询问密码来完成的。完成后,TGT 被解密并保存在票证缓存中。

    TGT 本身有部分用只有 kdc 知道的秘密加密,它不保存用户的密码。例如,this article from 2000 解释说,密码也不存储在票证缓存中 - 只是 TGT 的一部分。据我了解,使用票证缓存检查用户密码是不可能的。

    您可能想编写自己的 CallbackHandler 以某种方式重用或以编程方式提供凭据,但据我了解,这可能会导致安全问题。

    您可能想考虑用完全不同的方法来解决您的问题,但几乎没有信息可以建议任何其他解决方案。

    【讨论】:

    • 感谢猫普的精彩回答。实际上,从 Kerberos 数据库中检索用户密码似乎是不可能的。为了避免安全漏洞,我宁愿调用一个shell脚本来执行密码检查和更改。
    • 这是正确的。密码信息对 KDC 来说是私有的,并且在运行时不能以编程方式从 KDC 外部检索。否则这将是一个巨大的安全漏洞。
    【解决方案2】:

    我不知道这是否可能。该散列可以使用只有服务器知道的密钥来加盐。我会尝试使用用户的 id 和给定的字符串进行身份验证。如果服务器接受认证请求,则密码有效。

    【讨论】:

    • 感谢您的回答。我无法应用您的解决方案,因为用户已经过身份验证。为了让他更改他的kerberos密码,我必须检查他的身份购买询问他的旧密码。然后我必须将条目与真实密码进行比较。
    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多