JDBC批量加密mysql表中已有的密碼欄位資料
阿新 • • 發佈:2018-12-09
前言:
公司要求把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語句即可。