10

在一次面试中,面试官问我为什么需要私人证书JAAS
我们可以访问公共凭证和私有凭证,例如:

Set<Object> privateCredentials = subject.getPrivateCredentials();
Set<Object> publicCredentials = subject.getPublicCredentials();

(privateCredentialspublicCredentials) 都可以访问,访问方式相同。
那么,两种凭证的意义何在?

4

5 回答 5

9

摘自 Theodore Shrader、Bruce A. Rich、Anthony J. Nadalin 的“Java 和 Internet 安全”一书:

由于争议更大,JAAS 设计者得出的结论是,委托人可能有某种身份证明,他们需要能够立即提供,这些身份证明可能包括敏感信息,所以一组公共凭证和一个一组私人凭据也被添加到主题中。由于凭证的内容在不同的身份验证机制中可能有很大差异,从简单的密码到指纹(到无穷大和更多),凭证的类型简单地保留为 java.lang.Obiect。Principal 和凭证之间的关系(如果有的话)留给特定 Principal 类(或者更可能是特定 LoginModule 类)的实现者作为练习。从 JAAS 的角度来看,私有凭证和公共凭证之间的唯一区别是需要特定的 javax.security.auth.AuthPermission 才能访问私有凭证集

于 2012-10-03T14:03:58.247 回答
1

来自JAAS 参考指南

为了遍历一组私有凭据,您需要javax.security.auth.PrivateCredentialPermission访问每个凭据。有关详细信息,请参阅PrivateCredentialPermissionAPI 文档。

于 2012-09-25T08:19:13.333 回答
1

好吧,您通常根本不需要它们。我有一个相当大的 JAAS 系统,大约有 7 个 LoginModule,而且我根本不使用私有凭据。例如,如果您想存储用户的密码或私钥以供系统的其他部分检索,您将使用它们,但是没有必要这样做,这完全取决于您如何设计系统。我的态度是密码在 LDAP 中,它就在那里,而且我没有拥有私钥的用户。

但是,当您确实需要它们时,您需要将它们与公共凭据分开,因为它们是私有的,而不是公共的,init? 事实上,他们可以通过要求PrivateCredentialPermissions访问它们来进一步保护它们。

于 2012-10-05T02:03:10.980 回答
0

根据我对 JAAS 的理解(以及对一般 SW 设计原则的更多理解)
,Subject 是一个实体,代表请求的来源,例如用户,并且由于 JAAS 是为各种授权/身份验证机制提供抽象 API,您还可以将主题视为某种抽象。

我将 JAAS 与 Krb5LoginModule 一起使用,例如,在我们的例子中,主体代表用户详细信息(用户名 + 领域 - 即 - “johndoe@ovirt.org”)。
用户可能拥有一组私有和公共凭据,具体取决于底层加密机制(我希望我在这里使用了正确的术语) - 例如,如果使用非对称密钥加密,您可以使用 getPublicCrendetials 来获取信息在公钥上。
getPrivateCredentials 将持有一组私钥,您可能需要特权才能获得该列表。
虽然我以前从未尝试过,但也许您可以使用 getPrivateCredentials 来获取私钥并将其用于数字签名?

我可以告诉你,我使用这些方法是为了获取 kerberos 票证,并获取有关其有效性(到期时间)的信息。我希望这能让您对为什么进行这种划分有更多的了解。

于 2012-09-28T18:15:56.133 回答
0

公共凭证可以自由地公开并在主题上传递。例子:

  • 证书
  • 公钥

私人凭据是秘密。由于主题对象可以拥有广泛的受众,因此需要隐藏这些对象以防止“外人”访问。API 提供了访问主题的私有凭证的限制,在其他答案中有详细说明。例子:

  • 密码
  • 私钥
于 2012-11-21T01:05:35.580 回答