12.5.2. 配置安全远程密码协议
要在应用程序里使用安全远程密码(Secure Remote Password,SRP)协议,你首先可以创建一个实现
SRPVerifierStore 接口的 MBean。关于这个实现的信息位于 SRPVerifierStore 实现。
过程 12.3. 集成现有的密码库
创建 hashed 密码信息库。
如果密码已经以不可逆的 hashed 形式存储,对每个用户你都需要这么做。你可以实现setUserVerifier(String, VerifierInfo)为 noOp 方法,或者抛出表示这个库是只读的异常。创建 SRPVerifierStore 接口。
创建一个可以从你创建的库里获取VerifierInfo的SRPVerifierStore接口实现。verifyUserChallenge(String, Object)可用来集成现有的基于硬件令牌的模式(如 SafeWord 或 Radius)到 SRP 算法。这个接口方法只有当客户 SRPLoginModule 配置指定了 hasAuxChallenge 选项才被调用。创建 JNDI MBean。
创建一个开放 JNDI 可用的SRPVerifierStore接口的 MBean,并开放任何所需的可配置参数。默认的org.jboss.security.srp.SRPVerifierStoreService允许你实现它。你也可以用SRPVerifierStore的一个 Java 属性文件实现来实现这个 MBean。
SRPVerifierStore 实现
我们不推荐在产品环境里使用 SRPVerifierStore 接口的默认实现,因为它要求所有的密码
SRPVerifierStore 实现为给定用户提供了对 SRPVerifierStore.VerifierInfo 对象的访问。SRPService 在启动用户 SRP 会话来获取 SRP 算法所需参数时调用 getUserVerifier(String)。
VerifierInfo 对象的元素
- username
- 用来验证的用户 ID 或用户名
- verifier
- 用户输入作为标识符凭证的单向哈希密码。
org.jboss.security.Util类包含了一个calculateVerifier方法,它执行密码的哈希算法。输出密码采用H(salt | H(username | ':' | password))形式,其中H是 RFC2945 定义的 SHA 安全哈希功能。用户名将使用 UTF-8 编码从字符串转换为 byte[]。 - salt
- 当数据库泄露时,随机数字用于增加对 verifier 密码数据库的 brute force 字典攻击的难度。当用户的现有明文密码进行哈希加密时,这个值应该根据一个强加密的随机数字算法生成。
- g
- SRP 算法的原始生成器。它可以是一个众所周知的固定参数而不用对每个用户进行设置。
org.jboss.security.srp.SRPConf工具类为g提供了几个设置,包括通过SRPConf.getDefaultParams().g()获得的合适的默认值。 - N
- SRP 算法的 safe-prime 系数。它可以是一个众所周知的固定参数而不用对每个用户进行设置。
org.jboss.security.srp.SRPConf工具类为g提供了几个设置,包括通过SRPConf.getDefaultParams().g()获得的合适的默认值。
例 12.13. SRPVerifierStore 接口