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

   项目需求

所有认证数据,例如密码,不论是在储存、传输中都必须妥善保护,以防泄露或被未获授权修改。在安全认证中的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 关于数据源的连接修改如下:

 



        

            oracle.jdbc.driver.OracleDriver

        

        

            jdbc:oracle:thin:@dbServer:1521:feelview

        

        

            feelview

        

        

            %QX7N顴服筜吩d/?

        

    

 

 

解析:

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

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

 

 

你可能感兴趣的:(如何实现数据库连接的密码加密)