MySQL 欄位加密

在很久很久以前, 帳號密碼是很少人在做加密的, 然而資訊安全概念提升與個資法逐步運行, 這個題目已經變成不可不處理的問題了.

加密是一個很通稱的說法, 因為在資料傳輸時, 會有 “資料傳送", “資料處理", 資料儲存" … 等很過程, 比方說, 資料傳送時配合 SSL 憑證的 https.

至於資料庫的加密, 大部份也都使用資料庫的函式來做變通, 如 MD5 等這種不可逆的運算方法

MySQL 中, 提供了一組非常有 Power 的加密函式, 就是 AES_ENCRYPT 與 AES_DECRYPT.

這兩個和 ENCODE 與 DECODE 不同的地方在於, AES_ENCRYPT/AES_DECRYPT 就算欄位是一個空值, 他仍能運算一個加密的值出來, 而 ENCODE/DECODE 等其它加密方式, 傳入空值, 其算出來也會是一個空的.

再者, AES_ENCRYPT/AES_DECRYPT 是經由 128bit 加密所組成, 所以在破解上也有一定的難度.

由於 AES_ENCRYPT 回傳值為 BINARY, 所以必需弄一個 BINARY 的欄位給他.

以下來做一個小小示範:

建立示範用 table

CREATE TABLE IF NOT EXISTS `USERS` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `LOGIN_ID` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `LOGIN_PW` varbinary(255) NOT NULL,
  `USER_NAME` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `C_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `STATUS` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`ID`),
  UNIQUE KEY `LOGIN_ID` (`LOGIN_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

設定 加/解密的 key

key = 2BC725612ED4DE3B638732F73677DF275385EF3A08E1E78D34A28FED3FCC55C1D41B3E3EE0000711B31A9D2FBD6507F689EC4333C018463D871B0D9DBDE24F55

塞入三筆資料, 包含一筆 LOGIN_PASS 為空值的資料

insert into USERS (LOGIN_ID, LOGIN_PW, USER_NAME) VALUES ('john', AES_ENCRYPT('thisisaverylongpasswordstring1', '2BC725612ED4DE3B638732F73677DF275385EF3A08E1E78D34A28FED3FCC55C1D41B3E3EE0000711B31A9D2FBD6507F689EC4333C018463D871B0D9DBDE24F55'), '約翰');
insert into USERS (LOGIN_ID, LOGIN_PW, USER_NAME) VALUES ('steven', AES_ENCRYPT('thisisaverylongpasswordstring2', '2BC725612ED4DE3B638732F73677DF275385EF3A08E1E78D34A28FED3FCC55C1D41B3E3EE0000711B31A9D2FBD6507F689EC4333C018463D871B0D9DBDE24F55'), '史蒂芬');
insert into USERS (LOGIN_ID, LOGIN_PW, USER_NAME) VALUES ('hapyycan', AES_ENCRYPT('', '2BC725612ED4DE3B638732F73677DF275385EF3A08E1E78D34A28FED3FCC55C1D41B3E3EE0000711B31A9D2FBD6507F689EC4333C018463D871B0D9DBDE24F55'), '開心果');

取出真實密碼的方法

SELECT *, AES_DECRYPT(LOGIN_PW, '2BC725612ED4DE3B638732F73677DF275385EF3A08E1E78D34A28FED3FCC55C1D41B3E3EE0000711B31A9D2FBD6507F689EC4333C018463D871B0D9DBDE24F55') DECOE_PASSWORD FROM USERS

以上, 如果沒有 key 的話, 就算 DB 被偷走還是沒有辦法查出密碼為何, 也因此提高了安全性的需求.

這函式從 MySQL 3.23 ~ MySQL 5.5 都可使用, 可以從 http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html 本看更多的加密方式與說明。

Comments are closed.

十月 2019
« 五月    
 123456
78910111213
14151617181920
21222324252627
28293031  

Google ADs