Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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
Java 如何使用Spring Security应用密码加密?_Java_Spring_Security_Spring Security_Jcryption - Fatal编程技术网

Java 如何使用Spring Security应用密码加密?

Java 如何使用Spring Security应用密码加密?,java,spring,security,spring-security,jcryption,Java,Spring,Security,Spring Security,Jcryption,我最近开始在现有的web应用程序中添加安全性。应用程序在将散列密码发送到服务器之前对其进行加密,然后在服务器端进行解密以获得散列值,然后将该散列值与db密码字段(MD5散列值)进行比较。这样我们就可以处理“中间人攻击”。在我在应用程序中引入Spring安全层(Spring Security 3.2.7,Java配置)之前,安装工作一直很好。现在,我在加密部分遇到了问题,我真的不知道如何继续 其他一切都正常工作,我使用了Md5PasswordEncoder对密码进行哈希运算。问题是用户名和密码是以

我最近开始在现有的web应用程序中添加安全性。应用程序在将散列密码发送到服务器之前对其进行加密,然后在服务器端进行解密以获得散列值,然后将该散列值与db密码字段(MD5散列值)进行比较。这样我们就可以处理“中间人攻击”。在我在应用程序中引入Spring安全层(Spring Security 3.2.7,Java配置)之前,安装工作一直很好。现在,我在加密部分遇到了问题,我真的不知道如何继续

其他一切都正常工作,我使用了Md5PasswordEncoder对密码进行哈希运算。问题是用户名和密码是以明文形式发送的。我不明白在通过网络发送密码之前如何加密密码如何将用户名/密码字段的AES加密/解密与Spring安全体系结构一起应用?


请理解,我已经在我的应用程序中使用了MD5哈希,我希望在上面有一个加密层。还有一件事,因为它是一个遗留应用程序我不能强制所有人使用HTTPS,HTTPS已启用,但并非所有人都必须使用。我更关心的是那些将使用普通的旧http访问应用程序的人。

您可以使用spring security编写自己的密码编码器,但首先需要AES加密/解密代码,以下是示例:

 public static String encrypt(String value) {

    if(value == null){
        return value;
    }
    // SALT is your secret key
    Key key = new SecretKeySpec(SALT.getBytes(), "AES");
    try {

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return Base64.encodeBase64String(cipher.doFinal(value.getBytes()));
    } catch (Exception exception) {
        throw new RuntimeException(exception);
    }
}

   public static String decrypt(String value) {

    if(value == null){
        return value;
    }
    // SALT is your secret key
    Key key = new SecretKeySpec(SALT.getBytes(), "AES");
    try {
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key);
        return new String(cipher.doFinal(Base64.decodeBase64(value)));
    } catch (Exception exception) {
        throw new RuntimeException(exception);
    }
}
然后我们可以将这些实用方法与PasswordEncoder结合使用,这样您就不需要在身份验证时解密用户密码,这是不安全的,您必须对密码进行编码,然后比较编码后的密码。(必须保存数据库中编码的用户密码) 以下是示例:

公共类CustomUserPasswordEncoder实现PasswordEncoder{

public String encode(CharSequence rawPassword) {
    return encrypt(rawPassword.toString());
}

public boolean matches(CharSequence rawPassword, String encodedPassword) {
    if (!StringUtils.isBlank(rawPassword) && encode(rawPassword).equals(encodedPassword)) {
        return true;
    }
    return false;
}
}

现在,我们可以这样设置spring安全密码编码器:

 passwordEncoder(new CustomUserPasswordEncoder());

您可以使用spring security编写自己的密码编码器,但首先需要AES加密/解密代码,以下是示例:

 public static String encrypt(String value) {

    if(value == null){
        return value;
    }
    // SALT is your secret key
    Key key = new SecretKeySpec(SALT.getBytes(), "AES");
    try {

        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return Base64.encodeBase64String(cipher.doFinal(value.getBytes()));
    } catch (Exception exception) {
        throw new RuntimeException(exception);
    }
}

   public static String decrypt(String value) {

    if(value == null){
        return value;
    }
    // SALT is your secret key
    Key key = new SecretKeySpec(SALT.getBytes(), "AES");
    try {
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, key);
        return new String(cipher.doFinal(Base64.decodeBase64(value)));
    } catch (Exception exception) {
        throw new RuntimeException(exception);
    }
}
然后我们可以将这些实用方法与PasswordEncoder结合使用,这样您就不需要在身份验证时解密用户密码,这是不安全的,您必须对密码进行编码,然后比较编码后的密码。(必须保存数据库中编码的用户密码) 下面是一个例子:

公共类CustomUserPasswordEncoder实现PasswordEncoder{

public String encode(CharSequence rawPassword) {
    return encrypt(rawPassword.toString());
}

public boolean matches(CharSequence rawPassword, String encodedPassword) {
    if (!StringUtils.isBlank(rawPassword) && encode(rawPassword).equals(encodedPassword)) {
        return true;
    }
    return false;
}
}

现在,我们可以这样设置spring安全密码编码器:

 passwordEncoder(new CustomUserPasswordEncoder());
  • 您需要使用HTTPS通过internet发送用户密码

    说真的,如果你不这么做,你的用户可以/将会起诉你。LinkedIn最近放弃了数百万美元,因为它没有对用户的密码给予应有的注意

    LetsEncrypt是免费的,应用广泛

  • 在客户机上不使用HTTPS或哈希进行加密是错误和糟糕的。仅在服务器上使用哈希

  • MD5是最糟糕的哈希方法。同样,你可能会被起诉

    仅使用以下各项:bcrypt、scrypt、PBKDF-2

    弹簧有一个内置的弹簧

  • 您需要使用HTTPS通过internet发送用户密码

    说真的,如果你不这么做,你的用户可以/将会起诉你。LinkedIn最近放弃了数百万美元,因为它没有对用户的密码给予应有的注意

    LetsEncrypt是免费的,应用广泛

  • 在客户机上不使用HTTPS或哈希进行加密是错误和糟糕的。仅在服务器上使用哈希

  • MD5是最糟糕的哈希方法。同样,你可能会被起诉

    仅使用以下各项:bcrypt、scrypt、PBKDF-2

    弹簧有一个内置的弹簧


  • +1,谢谢你的回答,顺便说一句,我没有解密密码并将其转换为纯文本的计划,我将只加密哈希值。。在服务器端,只比较哈希值。还有一件事,在客户端提交表单之前,我如何加密这些值。您可以从这里获得信息+1,谢谢你的回答,顺便说一句,我没有解密密码并将其转换为纯文本的计划,我将只加密哈希值。。在服务器端,只比较哈希值。还有一件事,在客户端提交表单之前,我如何加密这些值。您可以从这里获得信息。你没有处理中间人的攻击。双向加密只是一个间接层。另外,当你有一个男人在中间时,他仍然会得到散列密码,他仍然可以用它登录。所以,基本上你是在增加复杂性,而没有得到任何东西。。。IMHO.@M.Deinum jcryption不也提供双向身份验证吗?在将值发送到服务器之前,是否使用了唯一密钥和质询?我仍在学习jcryption,所以如果我错了,请纠正我。我不知道jcryption,但通常在进行双向加密时,它只会增加复杂性。您的连接应该已经安全(https)。中间人攻击通常是检索cookie,然后使用该会话cookie窃取会话。但是有一个java版本,尽管是旧版本。您可能可以将其安装到Spring Security或普通过滤器中。您没有处理中间人攻击。双向加密只是一个间接层。另外,当你有一个男人在中间时,他仍然会得到散列密码,他仍然可以用它登录。所以,基本上你是在增加复杂性,而没有得到任何东西。。。IMHO.@M.Deinum jcryption不也提供双向身份验证吗?在将值发送到服务器之前,是否使用了唯一密钥和质询?我仍在学习jcryption,所以如果我错了,请纠正我。我不知道jcryption,但通常在进行双向加密时,它只会增加复杂性。您的连接应该已经安全(https)。中间人攻击通常是检索cookie,然后使用该会话cookie窃取会话。但是有一个JavaV