mysql 连接加密_mysql数据库连接账户使用加密的方式

整体流程

①在在配置文件applicatiooncontext中设置自定义的配置文件解析的属性,

classpath:/config/database.properties

database.dev.username

database.dev.password

②PropertyConfigurer工具类中会判断decodePropertyNames的value值是否与PropertyNames中的名称一致,如果一致,就会进行解密操作

③使用MessageDigestCodingUtil工具类进行加密和解密,加密是先进行base64加密,在进行16位加密;解密反过来,先解16位,在进行64位的解密。

1.Base64的加密类

package com.fjep.utils;

/**

*说明:64位加密算法*/

public class Base64 {

private static char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".toCharArray();

private static byte codes[];

public Base64() {

}

public static byte[] decode(char data[]) {

int tempLen = data.length;

for (int ix = 0; ix

if (data[ix]> '\377' || codes[data[ix]] <0) {

tempLen--;

}

}

int len= (tempLen/ 4) * 3;

if (tempLen % 4==3) {

len += 2;}

if (tempLen % 4==2) {

len++;

}

byte out[]= newbyte[len];

int shift= 0;int accum= 0;int index= 0;for (int ix= 0;ix < data.length; ix++) {

int value= data[ix]<= '\377'? ( (int) (codes[data[ix]])) : -1;

if (value>= 0) {

accum<<= 6;

shift += 6;accum |= value;if (shift>= 8) {

shift -= 8;

out[index++] = (byte) (accum >> shift & 0xff);

}

}

}

if (index != out.length) {

throw new Error("Miscalculated data length (wrote " + index + " instead of " + out.length + ")");

} else {

return out;

}

}

public static char[] encode(byte data[]) {

char out[] = new char[ ( (data.length + 2) / 3) * 4];

int i = 0;

for (int index = 0; i

boolean quad= false;boolean trip= false;int val= 0xff& data[i];

val <<= 8;if (i + 1 < data.length) {

val |= 0xff& data[i + 1];

trip= true;}

val <<= 8;if (i + 2 < data.length) {

val |= 0xff& data[i + 2];

quad= true;}

out[index + 3]= alphabet[quad? val & 0x3f : 64];

val>>= 6;

out[index + 2] = alphabet[trip ? val & 0x3f : 64];

val >>= 6;

out[index + 1] = alphabet[val & 0x3f];

val >>= 6;

out[index] = alphabet[val & 0x3f];

i += 3;

}

return out;

}

static {

codes = new byte[256];

for (int i = 0; i<256; i++) {

codes[i]= -1;}

for (int i= 65;i <= 90;i++) {

codes[i]= (byte)(i - 65);

}

for (int i= 97;i <= 122;i++) {

codes[i]= (byte)( (26 + i) - 97);

}

for (int i= 48;i <= 57;i++) {

codes[i]= (byte)( (52 + i) - 48);

}

codes[43]= 62;codes[47]= 63;}

public static void main(String[] args) {

try {

String encode= newString(Base64.encode("ioffice".getBytes()));

System.out.println(encode);

System.out.println(new String(Base64.decode("5a6d706c634441774d413d3d".toCharArray())));

} catch (Exception e) {

e.printStackTrace();

}

}

}

2.具体加密解密的工具类MessageDigestCodingUtil

package com.fjep.utils;

import org.apache.commons.codec.DecoderException;

import org.apache.commons.codec.binary.Hex;

/**

*说明:进行数值摘要的加密和解密处理*/

public class MessageDigestCodingUtil {

/**

*

*摘要:加密操作

*@说明:先进行64位的加密 再继续16进制的加密

*@param encode

*@return*/

public static String encode(String encode)

{

encode=new String(Base64.encode(encode.getBytes()));

encode=new String(Hex.encodeHex(encode.getBytes()));

return encode;

}

/**

*

*摘要:解密操作

*@说明:先进行16进制的解密,再进行64位的解密

*@param decode

*@return*/

public static String decode(String decode)

{

try {

decode=new String(Hex.decodeHex(decode.toCharArray()));

decode=new String(Base64.decode(decode.toCharArray()));

} catch (DecoderException e) {

e.printStackTrace();

}

return decode;

}

public static void main(String[] args)

{

//String str=MessageDigestCodingUtil.encode("jdbc:oracle:thin:@10.188.80.98:1521:dev");

//System.out.println("encrypt="+MessageDigestCodingUtil.encode("root"));

System.out.println("encrypt1="+MessageDigestCodingUtil.decode("5a6d706c634639335a57493d"));

// System.out.println("encrypt="+MessageDigestCodingUtil.decode("5a6d706c634441774d413d3d"));

}

}

3.对配置文件操作的类PropertyConfigurer

package com.fjep.common;

import java.io.IOException;

import java.util.Enumeration;

import java.util.List;

import java.util.Properties;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

import org.springframework.util.ObjectUtils;

import com.fjep.utils.MessageDigestCodingUtil;

/**

*说明:对.properties文件进行解析操作*/

public class PropertyConfigurer extends PropertyPlaceholderConfigurer {

private static final Log log=LogFactory.getLog(PropertyConfigurer.class);

/**

* 需要进行解密的属性名称 decodePropertyNames

**zbs*zbs2**/

private ListdecodePropertyNames;

private Properties springPropertiesDatas=null;

@SuppressWarnings("unchecked")

@Override

protected void convertProperties(Properties props) {

Enumeration propertyNames = props.propertyNames();

while (propertyNames.hasMoreElements()) {

String propertyName = (String) propertyNames.nextElement();

String propertyValue = props.getProperty(propertyName);

String convertedValue=null;

if(this.decodePropertyNames!=null&&decodePropertyNames.size()>0)

{

if(this.decodePropertyNames.contains(propertyName))

{

convertedValue=MessageDigestCodingUtil.decode(propertyValue);

}else

{

convertedValue = convertPropertyValue(propertyValue);

}

}else

convertedValue = convertPropertyValue(propertyValue);

if (!ObjectUtils.nullSafeEquals(propertyValue, convertedValue)) {

props.setProperty(propertyName, convertedValue);

}

}

}

public ListgetDecodePropertyNames() {

return decodePropertyNames;

}

public void setDecodePropertyNames(ListdecodePropertyNames) {

this.decodePropertyNames = decodePropertyNames;

}

public String getPropertyValue(String key)

{

if(springPropertiesDatas==null)

{

try {

this.springPropertiesDatas=super.mergeProperties();

} catch (IOException e) {

log.equals(e);

}

}

String value=this.springPropertiesDatas.get(key).toString();

if(this.decodePropertyNames.contains(key))

{

value=MessageDigestCodingUtil.decode(value);

}

return value;

}

}

4.在applicationContext.xml文件添加如下设置,

classpath:/config/database.properties

database.dev.username

database.dev.password

5.datasouce.property

#本地数据库连接

database.dev.password=636d397664413d3d

database.dev.url=jdbc:mysql://localhost:3306/selected

database.dev.username=636d397664413d3d

database.driver=com.mysql.jdbc.Driver

hibernate.show_sql=false

#初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。

database.initialPoolSize=2

#连接池中保留的最小连接数

database.minPoolSize=2

#连接池中保留的最大连接数。

database.maxPoolSize=8

#最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0

database.maxIdleTime=60

#每30分钟检查所有连接池中的空闲连接。Default: 0

database.idleConnectionTestPeriod=1800

#org.gjt.mm.mysql.Driver

#com.mysql.jdbc.Driver

database.checkoutTimeout=60000

#org.gjt.mm.mysql.Driver

#com.mysql.jdbc.Driver

database.timeBetweenEvictionRunsMillis=60000

database.minEvictableIdleTimeMillis=300000

database.validationQuery=SELECT 'x' from dual

database.testWhileIdle=true

database.testOnBorrow=false

database.testOnReturn=false

database.filters=stat

database.poolPreparedStatements=true

database.maxOpenPreparedStatements=50

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值