【发布时间】:2017-06-30 13:53:12
【问题描述】:
我正在使用基于密码的 Jboss 5.1.0 加密来保护我们的服务器。
我已阅读 RFC 的部分内容:
https://www.rfc-editor.org/rfc/rfc2898
Jboss的几篇文档我已经看了好几遍了:
https://docs.jboss.org/jbosssecurity/docs/6.0/security_guide/html/Encrypting_Data_Source_Passwords.html(适用于 6.0,但适用于 5.1.0)
现在,让我解释一下我的问题。
在上面列出的官方 JBoss 文档中,他们将“安全身份”加密视为安全的。哎呀,它在文件中。 更糟糕的是,我看到其他人在 Stack Overflow 上就如何使用它提出问题。 这不安全。为了使其安全,必须编写自己的加密类来覆盖 org.jboss.resource.security.SecureIdentityLoginModule。
我可以通过在谷歌上快速搜索“解密 Jboss 5.1.0 密码”来证明这一点,第一个结果是一个 jar 文件,它使用官方 Jboss 文档中推荐的方法解密了 Jboss 密码。
输入基于密码的加密。
知道我已经在第一种方法中发现了一个安全漏洞,我已经厌倦了从这个文档中获取建议——如果你错了一次,你可能错了两次。但是,我似乎没有我必须使用方法 2:基于密码的加密。
我担心的是,文档让我生成一个“master.password”文件。我假设这是 RFC 中提到的派生密钥函数。不过,我不确定。
总而言之,我的直觉告诉我: 你让我在我的服务器上存储一个 master.password。包含派生密钥函数的 master.password 文件可以被某处的某些代码用来简单地解密我的加密密码。那是因为我在其他文件的其他地方指定了盐和迭代。
整个过程看起来像是一个数学函数。在我看来,它看起来像这样:
? = DerivedKeyFunction(Salt, Iterations, Password)
但对于黑客来说,它看起来像这样:
EncodedPassword = DerivedKeyFunction(Salt, Iterations, ?)
我声称自己既不是密码学家也不是 Jboss 专家,但我的直觉告诉我,黑客需要做的就是查看 Jboss 源代码(据我所知是开源的)并做一些事情使用 server.password 文件进行一些逆向工程以获取密码。
所以我的问题是:Jboss 上基于密码的加密有多安全(假设黑客获得了对服务器的访问权限)?有没有人真正研究过这个?
------------ 编辑 -----
澄清: 这是为了让 JBoss 连接到我们的数据库。这不适用于最终用户在 Web 应用程序上登录其用户帐户。
JBoss 使用包含某种加密字符串的 master.password(或 server.password...它只是一个文件名)。我不确定这里有什么,它没有很好的记录(或者它可能是,我只是不明白)。
配置完成后,不再输入密码。我不明白这是如何安全的。我猜我可以以某种方式使用在步骤 1 中创建的 server.password 文件来解密我的数据库密码。有人只是还没有写一个方便的 jar 文件。但是代码是开源的,所以我猜合适的人知道如何很容易地做到这一点。
我正在分享这些步骤,因为我看到人们在堆栈溢出时使用了许多糟糕的设置。步骤如下:
-
从 jboss/common/lib 文件夹,创建 server.password 文件。放在 server/conf 目录下。:
java -cp jbosssx.jar org.jboss.security.plugins.FilePassword <8Charactersalt> <iterationsMoreThan1000> <aLongRandomPassword> server.password #outputs server.password file which contains encrypted string. -
加密数据库密码
java -cp jbosssx.jar org.jboss.security.plugins.PBEUtils <8Charactersalt> <iterationsMoreThan1000> <aLongRandomPassword> <databaseConnectionPassword> #outputs encrypted DB Password -
删除用户名和密码并更新数据源 XML
<security-domain>EncryptedMySqlDbRealm</security-domain> <depends>jboss.security:service=JaasSecurityDomain,domain=ServerMasterPassword</depends> -
将 Mbean 添加到数据源 XML。它指定 server.password 文件、盐和迭代。
{CLASS}org.jboss.security.plugins.FilePassword:${jboss.server.home.dir}/conf/server.password ${8Charactersalt} ${iterationsMoreThan1000}
-
将应用程序策略添加到登录配置 XML。指定用户名、加密密码和要加密的数据源。应用程序策略和数据源之间存在 1 对 1 的映射,因此如果您有两个数据源,那么您似乎也需要 2 个应用程序策略。否则启动 jboss 会出错。
${数据库用户名} ${加密密码} jboss.jca:service=LocalTxCM,name=${DataSourceNameFromDatasourceXML} jboss.security:service=JaasSecurityDomain,domain=ServerMasterPassword
【问题讨论】:
标签: security jboss cryptography