Spring数据库连接等配置加密

1 加密工具类
可以使用自己的加密解密工具替换encrypt(String encText)和decrypt(String decText)方法就行了。

public class ConfigCryptoUtil {

	// 这个密码需要修改为自己的密码
	private final static String PASSWORD = "password";
	// 加密算法
	private final static String ALGORITHM = "PBEWithMD5AndDES";
	// 盐
	private final static byte[] SALT = "63293188".getBytes();
	// 迭代次数
	private final static int INTERATION_COUNT = 1000;

	
	private static Key getPBEKey() {
		SecretKeyFactory keyFactory;
		SecretKey key = null;
		PBEKeySpec keySpec = new PBEKeySpec(PASSWORD.toCharArray());
		try {
			keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
			key = keyFactory.generateSecret(keySpec);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return key;
	}

	/**
	 * 加密
	 * 
	 * @param encText
	 *            要加密文本
	 * @return
	 */
	public static String encrypt(String encText) {
		Key key = getPBEKey();
		byte[] encTextByte = null;
		PBEParameterSpec parameterSpec = new PBEParameterSpec(SALT, INTERATION_COUNT);
		try {
			Cipher cipher = Cipher.getInstance(ALGORITHM);
			cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
			encTextByte = cipher.doFinal(encText.getBytes());
		} catch (Exception e) {
		}
		return bytesToHexString(encTextByte);
	}

	/**
	 * 解密
	 * 
	 * @param decText
	 *            要解密文本
	 * @return
	 */
	public static String decrypt(String decText) {
		Key key = getPBEKey();
		byte[] decTextByte = null;
		PBEParameterSpec parameterSpec = new PBEParameterSpec(SALT, INTERATION_COUNT);
		try {
			Cipher cipher = Cipher.getInstance(ALGORITHM);
			cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
			decTextByte = cipher.doFinal(hexStringToBytes(decText));
		} catch (Exception e) {
		}
		return new String(decTextByte);
	}

	// 以下代码百度
	public static String bytesToHexString(byte[] src) {
		StringBuilder stringBuilder = new StringBuilder();
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}

	// 以下代码百度
	public static byte[] hexStringToBytes(String hexString) {
		if (hexString == null || hexString.equals("")) {
			return null;
		}
		hexString = hexString.toUpperCase();
		int length = hexString.length() / 2;
		char[] hexChars = hexString.toCharArray();
		byte[] d = new byte[length];
		for (int i = 0; i < length; i++) {
			int pos = i * 2;
			d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
		}
		return d;
	}

	// 以下代码百度
	private static byte charToByte(char c) {
		return (byte) "0123456789ABCDEF".indexOf(c);
	}

	public static void main(String[] args) {
		String encText = "我是要加密字符串";
		String decText = encrypt(encText);
		System.out.println("密文:" + decText);
		String org = decrypt(decText);
		System.out.println("明文:" + org);
	}
}

2 继承PropertyPlaceholderConfigurer
已经加密的配置信息需要在decryptNames中指定,这样才会进行解密

public class CryptoPlaceholderConfigurer extends PropertyPlaceholderConfigurer {

	/**
	 * 需要被解密字段
	 */
	private String[] decryptNames;
	
	public CryptoPlaceholderConfigurer() {
		
	}
	
	// spring-3.x以上
	@Override
	protected String convertProperty(String propertyName, String propertyValue) {

		if (isEncrypt(propertyName)) {
			return ConfigCryptoUtil.decrypt(propertyValue);
		}
		return propertyValue;
	}
	
	/**
	 * 该属性是否被加密
	 * 
	 * @param propertyName
	 * @return
	 */
	private boolean isEncrypt(String propertyName) {
		if (decryptNames != null && decryptNames.length > 0)
			for (String name : decryptNames) {
				if (name != null && name.equals(propertyName))
					return true;
			}
		return false;
	}

	public String[] getDecryptNames() {
		return decryptNames;
	}

	public void setDecryptNames(String[] decryptNames) {
		this.decryptNames = decryptNames;
	}

}

3 Spring Bean配置
所有的配置文件都可以使用CryptoPlaceholderConfigurer来读取,需要解密的放到decryptNames

<bean class="junfeng.config.CryptoPlaceholderConfigurer">
		<property name="location" value="classpath:dbconfig.properties" />
		<!-- <property name="decryptNames">
			<array>
				<value>jdbc.url</value>
				<value>jdbc.username</value>
				<value>jdbc.password</value>
			</array>
		</property> -->
	</bean>

4 dbconfig.properties配置文件
以下是没有加密的情况,加密后 jdbc.url=xxxx密文xxxxx

jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root

搞定了!

源代码点我下载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Security可以连接各种类型的数据库,包括关系型数据库和非关系型数据库。连接数据库的方式可以使用JDBC或者ORM框架,如Hibernate、MyBatis等。在Spring Security中,可以使用JdbcUserDetailsManager或者JdbcDaoImpl来实现用户认证和授权,也可以使用自定义的UserDetailsService和UserDetails来实现。在配置文件中,需要配置数据源和相应的SQL语句来实现数据库连接。 ### 回答2: Spring Security连接数据库是一种常见的身份验证和授权的方式。可以使用Spring Security的JDBC模块来实现该功能。 首先,需要在项目中添加Spring Security和相关的依赖。 然后,在Spring配置文件中配置数据源,例如可以使用Spring提供的内存数据库H2,也可以使用其他的数据库,例如MySQL、PostgreSQL等。配置数据源时,需提供数据库的连接信息,例如数据库的URL、用户名和密码等。 接下来,在配置文件中配置Spring Security的认证和授权方式。一般情况下,可以使用基于数据库的认证方式,即用户的信息存储在数据库中。可以定义一个用户表,包含用户名、密码和角色等字段。然后,可以使用JdbcTemplate等工具类操作数据库,例如查询用户信息,验证用户名和密码是否匹配等。 在Spring Security的配置中,可以通过定义UserDetailsService的实现类来获取用户信息。该实现类可以通过JdbcTemplate查询数据库,返回一个UserDetails对象,包含用户的详细信息。然后,Spring Security会自动根据该对象进行身份验证和授权操作。 在认证和授权过程中,可以通过其他的功能来增强安全性,例如使用密码加密算法对用户密码进行加密使用密码策略来限制密码的复杂度,使用记住我功能来提供用户的便利登录等。 最后,可以通过编写控制器和页面等来实现登录页面和权限管理等功能,例如根据用户的角色来显示不同的页面内容。 总结来说,Spring Security连接数据库是一种可靠的身份验证和授权方式,可以通过配置数据源和实现UserDetailsService来获取用户信息,实现对数据库的连接和操作。这样,系统可以根据数据库中的用户信息进行身份验证和授权操作,提供安全的访问控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值