Java 如何使用Spring Security应用密码加密?
我最近开始在现有的web应用程序中添加安全性。应用程序在将散列密码发送到服务器之前对其进行加密,然后在服务器端进行解密以获得散列值,然后将该散列值与db密码字段(MD5散列值)进行比较。这样我们就可以处理“中间人攻击”。在我在应用程序中引入Spring安全层(Spring Security 3.2.7,Java配置)之前,安装工作一直很好。现在,我在加密部分遇到了问题,我真的不知道如何继续 其他一切都正常工作,我使用了Md5PasswordEncoder对密码进行哈希运算。问题是用户名和密码是以明文形式发送的。我不明白在通过网络发送密码之前如何加密密码如何将用户名/密码字段的AES加密/解密与Spring安全体系结构一起应用?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对密码进行哈希运算。问题是用户名和密码是以
请理解,我已经在我的应用程序中使用了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());
+1,谢谢你的回答,顺便说一句,我没有解密密码并将其转换为纯文本的计划,我将只加密哈希值。。在服务器端,只比较哈希值。还有一件事,在客户端提交表单之前,我如何加密这些值。您可以从这里获得信息+1,谢谢你的回答,顺便说一句,我没有解密密码并将其转换为纯文本的计划,我将只加密哈希值。。在服务器端,只比较哈希值。还有一件事,在客户端提交表单之前,我如何加密这些值。您可以从这里获得信息。你没有处理中间人的攻击。双向加密只是一个间接层。另外,当你有一个男人在中间时,他仍然会得到散列密码,他仍然可以用它登录。所以,基本上你是在增加复杂性,而没有得到任何东西。。。IMHO.@M.Deinum jcryption不也提供双向身份验证吗?在将值发送到服务器之前,是否使用了唯一密钥和质询?我仍在学习jcryption,所以如果我错了,请纠正我。我不知道jcryption,但通常在进行双向加密时,它只会增加复杂性。您的连接应该已经安全(https)。中间人攻击通常是检索cookie,然后使用该会话cookie窃取会话。但是有一个java版本,尽管是旧版本。您可能可以将其安装到Spring Security或普通过滤器中。您没有处理中间人攻击。双向加密只是一个间接层。另外,当你有一个男人在中间时,他仍然会得到散列密码,他仍然可以用它登录。所以,基本上你是在增加复杂性,而没有得到任何东西。。。IMHO.@M.Deinum jcryption不也提供双向身份验证吗?在将值发送到服务器之前,是否使用了唯一密钥和质询?我仍在学习jcryption,所以如果我错了,请纠正我。我不知道jcryption,但通常在进行双向加密时,它只会增加复杂性。您的连接应该已经安全(https)。中间人攻击通常是检索cookie,然后使用该会话cookie窃取会话。但是有一个JavaV