1. 程式人生 > >JDBC批量加密mysql表中已有的密碼欄位資料

JDBC批量加密mysql表中已有的密碼欄位資料

前言:

      公司要求把mysql資料庫的user表中,把表中已有的使用者註冊的密碼資訊給加密處理,原本是沒有加密的,是明文。今天腦子也是迷迷糊糊的,所以程式碼呢,寫得有些low,也懶得改了,不過功能是實現了。

專案結構:

將原本的user表增加了兩個欄位,tid,jmpwd;tid:是為了後面用update更新語句時,有where條件,jmpwd:是為了防止寫錯了,搞的一個測試的欄位罷了。

將原本的id取消主鍵,將tid設定為主鍵,並且自增長。

ps:因為這裡的id不是自增長,目前用不到,需要搞個tid欄位設定為自增長。

MD5工具類:

package util;

/**
 * @author: Lucifer
 * @create: 2018-09-14 10:17
 * @description:
 **/
public class MD5Utils {
    public static String getMD5(String source) {
        return getMD5(source.getBytes());
    }

    public static String getMD5(byte[] source) {
        String s = null;
        char hexDigits[] = { // 用來將位元組轉換成 16 進製表示的字元
                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        try {
            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
            byte tmp[];
            synchronized (MD5Utils.class) {
                md.update(source);
                tmp = md.digest(); // MD5 的計算結果是一個 128 位的長整數,
            }
            // 用位元組表示就是 16 個位元組
            char str[] = new char[16 * 2]; // 每個位元組用 16 進製表示的話,使用兩個字元,
            // 所以表示成 16 進位制需要 32 個字元
            int k = 0; // 表示轉換結果中對應的字元位置
            for (int i = 0; i < 16; i++) { // 從第一個位元組開始,對 MD5 的每一個位元組
                // 轉換成 16 進位制字元的轉換
                byte byte0 = tmp[i]; // 取第 i 個位元組
                str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取位元組中高 4 位的數字轉換,
                // >>> 為邏輯右移,將符號位一起右移
                str[k++] = hexDigits[byte0 & 0xf]; // 取位元組中低 4 位的數字轉換
            }
            s = new String(str); // 換後的結果轉換為字串

        } catch (Exception e) {
            e.printStackTrace();
        }
        return s;
    }
}

demo:

import util.MD5Utils;

import java.sql.*;

/**
 * @author: Lucifer
 * @create: 2018-09-14 10:09
 * @description:
 **/
public class demo {

    public static void main(String[] args) {
        //宣告Connection物件
        Connection con;
        //驅動程式名
        String driver = "com.mysql.jdbc.Driver";
        //URL指向要訪問的資料庫名mydata
        String url = "jdbc:mysql://localhost:3306/test";
        //MySQL配置時的使用者名稱
        String user = "root";
        //MySQL配置時的密碼
        String password = "123456";
        //遍歷查詢結果集
        try {
            //載入驅動程式
            Class.forName(driver);
            //1.getConnection()方法,連線MySQL資料庫!!
            con = DriverManager.getConnection(url, user, password);
            if (!con.isClosed()) {
                System.out.println("Succeeded connecting to the Database!");
            }
            //2.建立statement類物件,用來執行SQL語句!!
            Statement statement = con.createStatement();
            //要執行的SQL語句
            String sql = "select * from user ";
            //3.ResultSet類,用來存放獲取的結果集!!
            ResultSet rs = statement.executeQuery(sql);
            System.out.println("-----------------");
            System.out.println("執行結果如下所示:");
            System.out.println("-----------------");
            System.out.println("使用者名稱" + "\t" + "密碼" + "\t" + "加密密碼");
            System.out.println("-----------------");
            String loginname = null;
            String pwd = null;
            String jmpwd = null;
            int hs = 0;
            while (rs.next()) {
                //獲取stuname這列資料
                loginname = rs.getString("loginname");
                //獲取stuid這列資料
                pwd = rs.getString("password");
                jmpwd = MD5Utils.getMD5(pwd);
                hs++;
                //輸出結果
                System.out.println(loginname + "\t" + pwd + "\t" + jmpwd);
            }
            System.out.println(hs + "位使用者");
            rs.close();
            Statement statement2 = con.createStatement();
            for (int i = 1; i < hs + 1; i++) {
                String sql2 = "select password from user where tid='" + i + "'";
                //3.ResultSet類,用來存放獲取的結果集!!
                ResultSet rs2 = statement2.executeQuery(sql2);
                while (rs2.next()) {
                    String passWd = rs2.getString("password");
                    String jm = MD5Utils.getMD5(passWd);
                    System.out.println("加密:" + jm);
                    Statement statement3 = con.createStatement();
                    String sql3 = "UPDATE USER as u1,(select password from user where tid='" + i + "') as u2 set u1.jmpwd='" + jm + "' where u1.tid='" + i + "' ";
                    statement3.executeUpdate(sql3);
                }
            }
            con.close();
        } catch (ClassNotFoundException e) {
            //資料庫驅動類異常處理
            System.out.println("Sorry,can`t find the Driver!");
            e.printStackTrace();
        } catch (SQLException e) {
            //資料庫連線失敗異常處理
            e.printStackTrace();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        } finally {
            System.out.println("資料庫資料成功獲取!!");
        }
    }

}

ps:

    demo類執行後,jmpwd的欄位資料此時有了,這時可以把表中tid欄位刪除了,並且jmpwd欄位只是為了測試而已,你可以先用jmpwd欄位測試,如果直接想在password欄位更新,改變demo類中的update語句即可。