在采访中,面试官问我为什么需要私人凭证JAAS
?
我们可以访问公共凭据和私人凭据,例如:
Set<Object> privateCredentials = subject.getPrivateCredentials();
Set<Object> publicCredentials = subject.getPublicCredentials();
两者(privateCredentials
和publicCredentials
)均可访问,访问方式相同。
那么,两种凭证的重要性是什么?
答案 0 :(得分:6)
来自Theodore Shrader的“Java and Internet Security”一书,Bruce A. Rich,Anthony J. Nadalin:
随着争议的增加,JAAS的设计人员得出结论,校长可能会有某种身份证明,他们需要能够立即提供这些身份证明,而这些身份证明可能包含敏感信息,因此一组公开还在Subject中添加了凭据和一组私有凭据。由于凭证的内容在身份验证机制之间可能存在很大差异,从简单的密码到指纹(到无限和超越),凭证的类型只是保留为java.lang.Obiect。委托人和凭证之间的关系(如果有的话)被留作特定Principal类(或更可能是特定的LoginModule类)的实现者的练习。 从JAAS的角度来看,私有凭证和公共凭证之间的唯一区别是,访问私人凭证集需要特定的javax.security.auth.AuthPermission。
答案 1 :(得分:1)
为了遍历一组私有凭据,您需要
javax.security.auth.PrivateCredentialPermission
来访问每个凭据。有关详细信息,请参阅PrivateCredentialPermission
API文档。
答案 2 :(得分:1)
一般来说,你根本不需要 。我有一个相当大的JAAS系统,大约有7个LoginModule,我根本不使用私有凭据。如果您想要存储用户的密码或私钥以供系统的其他部分检索,您可以使用它们,但是没有什么内在需要这样做,这完全取决于您如何设计系统。我的态度是密码在LDAP中,而且它就在那里,而且我没有私钥用户。
但是当你做需要它们时,你需要它们与公共凭据分开,因为它们是私有的,而不是公共的,不是吗?确实可以通过要求PrivateCredentialPermissions
访问它们来进一步保护它们。
答案 3 :(得分:0)
从我对JAAS的理解(以及对一般软件设计原理的更多理解)
Subject是一个实体代表请求的来源,例如用户,并且由于JAAS是为各种授权/认证机制提供抽象API,您还可以将Subject视为某种抽象。
我正在使用JAAS和Krb5LoginModule,例如,在我们的例子中,principal代表用户详细信息(用户名+领域 - 即 - “johndoe@ovirt.org”)。
用户可能拥有一组私有和公共凭据,具体取决于底层加密机制(我希望我在这里使用正确的术语) - 例如,如果使用非对称密钥加密,您可以使用getPublicCrendetials来获取信息在公钥上。
getPrivateCredentials将包含一组私钥,您可能需要特权才能获取该列表。
虽然我之前从未尝试过,但也许您可以使用getPrivateCredentials来获取私钥并将其用于数字签名?
我可以告诉你,我使用这些方法来获取kerberos票,并获得有关其有效性(到期时间)的信息。
我希望这能让你更加了解为什么要进行这种划分。
答案 4 :(得分:0)
可以自由公开和传播公共证书。例子:
私人证件是秘密。由于Subject对象可以拥有广泛的受众,因此需要隐藏这些对象以免被“局外人”访问。 API提供了访问Subject的私有凭据的限制,这些在其他答案中有详细说明。例子: