如何实现数据库连接的密码加密

   项目需求

所有认证数据,例如密码,不论是在储存、传输中都必须妥善保护,以防泄露或被未获授权修改。在安全认证中的Fortify 静态代码分析器的扫描中,如果密码明文放在文件中是肯定过不去的。

 

需求解决方案

下面具体结合SSH的框架的代码实现。

1. 认证数据加密

所有认证数据通过 3DES 加密;加解密方法如下:

byte src_byte[] = password.getBytes();

byte key_byte[] = "123456781234567812345678".getBytes();// 3DES 24 bytes key

 

  try {

    // 生成DES密钥

    javax.crypto.SecretKey deskey;

deskey = genDESKey(key_byte);

        System.out.println("Generator DES KEY OK");

 

          // DES加解密

         byte[] encrypt, decrypt;

        //加密

        encrypt = desEncrypt(deskey, src_byte);

        System.out.println("encrypt=" + new String(encrypt));

       //解密

       decrypt = desDecrypt(deskey, encrypt);

   System.out.println("decrypt=" + new String(decrypt));

}

     catch (Exception ex) {

      ex.printStackTrace();

  }

 

 

 

解析说明:

第一步,调用 genDESKey 生成 24 位的 3DES 密销;

第二步,调用 desEncrypt desDecrypt 方法进行加解密 ;

以上三个函数代码如下:

1.    生成密销函数 : genDESKey

 

 

 

/**

 * 生成3DES密钥.

 *

 * @param key_byte seed key

 * @throws Exception

 * @return javax.crypto.SecretKey Generated DES key

 */

public static javax.crypto.SecretKey genDESKey(byte[] key_byte) throws

    Exception { SecretKey k = null;

        k = new SecretKeySpec(key_byte,"DESede");

        return k;

}

 

2.    加密函数: desEncrypt

/**

 * 3DES加密(byte[]).

 *

 * @param key SecretKey

 * @param src byte[]

 * @throws Exception

 * @return byte[]

 */

public static byte[] desEncrypt(javax.crypto.SecretKey key, byte[] src) throws

    Exception {

        javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance(

         "DESede");

        cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, key);

        return cipher.doFinal(src);

}

 

 

 

3.    解密函数: desDecrypt

 

/**

 * 3DES 解密(byte[]).

 *

 * @param key SecretKey

 * @param crypt byte[]

 * @throws Exception

 * @return byte[]

 */

public static byte[] desDecrypt(javax.crypto.SecretKey key, byte[] crypt) throws

    Exception {

  javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance(

      "DESede");

  cipher.init(javax.crypto.Cipher.DECRYPT_MODE, key);

  return cipher.doFinal(crypt);

}

 

2. hibernate 数据库连接密码处理

Hibernate 的数据库连接密码加密放在配置文件和数据库中,具体spring+hibernate 连接配置修改连接如下:

步骤1:spring 关于数据源的连接修改如下:

 

<bean id="dataSource" class="com.hqlTest.MyBasicDataSource" destroy-method="close">

        <property name="driverClassName">

            <value>oracle.jdbc.driver.OracleDriver</value>

        </property>

        <property name="url">

            <value>jdbc:oracle:thin:@dbServer:1521:feelview</value>

        </property>

        <property name="username">

            <value>feelview</value>

        </property>

        <property name="password">

            <value>%QX7N顴服筜吩d/?</value>

        </property>

    </bean>

 

 

解析:

dataSource class org.apache.commons.dbcp.BasicDataSource 改为自己创建的 com.hqlTest.MyBasicDataSource

BasicDataSource 类所做的事只有二件:1,继承 BasicDataSource ;2 ,重写 (override) 密码设置方法 setPassword ;函数 setPassword 中实现密码的 3DES 解密;

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值