1

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

其他一切正常,我使用 Md5PasswordEncoder 对密码进行哈希处理。问题是用户名和密码是以纯文本形式发送的。我不明白如何在通过网络发送密码之前对其进行加密。如何应用 AES 加密/解密用户名/密码字段以及 Spring 安全架构?

请理解我已经在我的应用程序中使用了MD5散列,并且我想要一个加密层。还有一件事,因为它是一个遗留应用程序,我不能强迫每个人都使用 HTTPS,启用了 https,但这并不是所有人都必须这样做的。我更关心那些将使用普通的旧 http 访问应用程序的人。

4

2 回答 2

4
  1. 您需要使用 HTTPS 通过 Internet 发送用户的密码。

    说真的,如果您不这样做,您的用户可以/将会起诉您。LinkedIn 最近放弃了几百万美元,因为他们没有适当注意用户的密码。

    LetsEncrypt 是免费的并且被广泛使用。

  2. 在客户端上不使用 HTTPS 或散列进行加密是错误和糟糕的。仅在服务器上散列。

  3. MD5 是最差的哈希方法。同样,您可能会被起诉。

    仅使用以下内容:bcrypt、scrypt、PBKDF-2

    Spring 有一个内置的bcrypt 密码编码器

于 2015-05-22T18:54:13.893 回答
1

您可以使用 Spring Security 编写自己的 PasswordEncoder,但首先您需要 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 Security 密码编码器:

 passwordEncoder(new CustomUserPasswordEncoder());
于 2015-05-22T06:33:10.817 回答