Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security WildFly:JavaEE应用程序中随机添加的密码_Security_Salt_Java Ee 7_Wildfly 8 - Fatal编程技术网

Security WildFly:JavaEE应用程序中随机添加的密码

Security WildFly:JavaEE应用程序中随机添加的密码,security,salt,java-ee-7,wildfly-8,Security,Salt,Java Ee 7,Wildfly 8,WildFly(8.2)如何处理存储在数据库中的随机加密密码 org.jboss.crypto.digest.DigestCallback的实现(在密码验证过程中)是否意味着可以从数据库访问salt部分 或者,在将密码交给HttpServletRequest的login方法之前,我是否应该简单地对密码进行散列和加密?在我看来,处理密码的“疯狂方式”是做大多数容器所做的事情,并提供一个开箱即用的非安全解决方案。我不知道为什么,但到目前为止,我看到的每个标准JDBC领域实现都只是对密码进行无盐散列。

WildFly(8.2)如何处理存储在数据库中的随机加密密码

org.jboss.crypto.digest.DigestCallback的实现(在密码验证过程中)是否意味着可以从数据库访问salt部分


或者,在将密码交给
HttpServletRequest
login
方法之前,我是否应该简单地对密码进行散列和加密?

在我看来,处理密码的“疯狂方式”是做大多数容器所做的事情,并提供一个开箱即用的非安全解决方案。我不知道为什么,但到目前为止,我看到的每个标准JDBC领域实现都只是对密码进行无盐散列。。。这是完全不安全的

开源解决方案

编辑:我发现了一个现成的解决方案,可以在WildFly上使用。最后我自己用了它,效果很好。我可以推荐:

下面是我如何配置它的:

首先,通过在
modules/
下面创建一个文件夹,向WildFly添加一个模块,如下所示:

C:\WildFly\v8.2.0\modules\de\rtner\PBKDF2\main

PBKDF2-1.1.0.jar
文件与包含以下内容的
module.xml
放在其中:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="de.rtner.PBKDF2">
  <resources>
    <resource-root path="PBKDF2-1.1.0.jar"/>
  </resources>
  <dependencies>
    <module name="org.picketbox"/>
    <module name="javax.api"/>
  </dependencies>
</module>`
SQL查询与标准的
数据库登录模块的查询相同。默认哈希选项不需要指定(因为它们是默认的),但在创建新用户时,您确实需要知道它们(并正确设置它们),以便使用相同的参数正确地哈希密码

示例使用

下面是我在代码中基于给定明文创建新密码哈希(包括salt)的步骤:

public static String hash(String plainText, String storedPassword) {
    if (plainText == null) return null;
    SimplePBKDF2 crypto = new SimplePBKDF2();
    PBKDF2Parameters params = crypto.getParameters();
    params.setHashCharset("UTF-8");
    params.setHashAlgorithm("HmacSHA1");
    params.setIterationCount(1000);
    if (storedPassword != null) {
        new PBKDF2HexFormatter().fromString(params, storedPassword);
    }
    return crypto.deriveKeyFormatted(plainText);
}
创建新密码时,将调用此函数,并将
null
作为
storedPassword
传递:

String password = hash('MySecretPassword', null);
password
将以如下方式结束:

"192EAEB3B7AA40B1:1000:4C137AF7AD0F3999D18E2B9E6FB726D5C07DE7D5"
比较密码时,调用相同的函数,传递原始密码,然后比较结果:

String enteredPassword = hash(userInput, password);
if (enteredPassword.equals(password)) {
    // Ok!
}
需要传递原始密码的原因是散列参数和salt存储在密码散列中,因此算法需要存储的密码来获取这些参数并将其用于新的散列。但是,您通常不需要自己比较密码,因为这已在登录模块中完成

或者,自己动手

给出了一些关于如何滚动添加了salt的领域实现的解释。他有,所以也许用那个


这是针对Glassfish的,但我认为这与领域实现代码无关。

我找到了一个很好的开源解决方案,我现在正在使用它。请参阅我编辑的答案。如何在此解决方案中实现密码salt?@user2630406我添加了一个新密码或用户输入哈希的示例,以与现有密码进行比较。salt是否存储在PBKDF2哈希中?在本例中,您在散列之前添加了盐,但这不适用于PBKDF2。@user2630406我不手动添加盐。。。这是通过哈希算法完成的。参数和salt实际上可以在散列密码中清楚地看到。我将在我的答案中添加一个示例结果,希望能澄清问题。那太棒了!
String enteredPassword = hash(userInput, password);
if (enteredPassword.equals(password)) {
    // Ok!
}