SpringMVC项目——数据库账户密码加密
目录1:为什么需要账户密码加密2:没有加密之前3:加密实现3.1:加密算法代码实现3.2:配置文件更改1:为什么需要账户密码加密在web项目中我们常常把数据库信息写入到配置文件中,便于降低代码耦合,但是明文的密码安全性较低。比如在同一个公司里边,有具体的运维实施团队,人多嘴杂。让他们部署不同的项目组的文件时,有经验的实施人员可能会查看你的配置文件中的数据账户密码信息,如...
·
目录
1:为什么需要账户密码加密
在web项目中我们常常把数据库信息写入到配置文件中,便于降低代码耦合,但是明文的密码安全性较低。比如在同一个公司里边,有具体的运维实施团队,人多嘴杂。让他们部署不同的项目组的文件时,有经验的实施人员可能会查看你的配置文件中的数据账户密码信息,如果管控不到位,会造成账户密码泄露的风险。所以我们需要对配置文件中的数据库账户密码信息加密。
2:没有加密之前
在没有加密之前的我们的配置文件通常如下,以此类引入外部的数据库配置文件,而数据库配置文件中的账户密码为明文,安全性比较低。
数据库配置文件明文如下,安全性较低
3:加密实现
3.1:加密算法代码实现
加密工具类:
package com.thit.util;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* @author 79027
* 对称性加密
*/
public class DESUtils
{
private static Key key;
//设置秘钥
private static String KEY_STR="mykey";
static{
try
{
//生成des算法对象
KeyGenerator generator = KeyGenerator.getInstance("DES");
//采用SHA1安全策略
SecureRandom secureRandom=SecureRandom.getInstance("SHA1PRNG");
//设置密匙种子
secureRandom.setSeed(KEY_STR.getBytes());
generator.init(secureRandom);
//生成密匙
key = generator.generateKey();
generator=null;
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
/**
* 对字符串进行加密,返回BASE64的加密字符串
* <功能详细描述>
* @param str
* @return
* @see [类、类#方法、类#成员]
*/
public static String getjiami(String str){
BASE64Encoder base64Encoder = new BASE64Encoder();
System.out.println(key);
try
{
byte[] strBytes = str.getBytes("UTF-8");
//获取加密对象
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptStrBytes = cipher.doFinal(strBytes);
return base64Encoder.encode(encryptStrBytes);
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
/**
* 对BASE64加密字符串进行解密
* <功能详细描述>
* @param str
* @return
* @see [类、类#方法、类#成员]
*/
public static String getjiemi(String str){
BASE64Decoder base64Decoder = new BASE64Decoder();
try
{ //将密码转化base64
byte[] strBytes = base64Decoder.decodeBuffer(str);
//初始化加密对象
Cipher cipher = Cipher.getInstance("DES");
//初始化加密信息按照
cipher.init(Cipher.DECRYPT_MODE, key);
//解密的得到数组
byte[] encryptStrBytes = cipher.doFinal(strBytes);
return new String(encryptStrBytes,"UTF-8");
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
public static void main(String[] args)
{
String name ="root";
String password="123456";
String encryname = getjiami(name);
String encrypassword = getjiami(password);
System.out.println(encryname);
System.out.println(encrypassword);
System.out.println(getjiemi(encryname));
System.out.println(getjiemi(encrypassword));
}
}
加密bean
package com.thit.util;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
public class EncryptPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
//配置解密字段
private String[] encryptPropNames = {"jdbc_username", "jdbc_password"};
@Override
protected String convertProperty(String propertyName, String propertyValue)
{
//如果在加密属性名单中发现该属性 进行解密
if (isEncryptProp(propertyName))
{
//开始解密
String decryptValue = DESUtils.getjiemi(propertyValue);
System.out.println(decryptValue);
return decryptValue;
}else {
//非加密字段直接返回
return propertyValue;
}
}
private boolean isEncryptProp(String propertyName)
{
for (String encryptName : encryptPropNames)
{
if (encryptName.equals(propertyName))
{
return true;
}
}
return false;
}
}
3.2:配置文件更改
数据库配置文件更改:
spring配置文件更改:
更多推荐
已为社区贡献2条内容
所有评论(0)