加密是將字串(明文)用金鑰(key)編碼成為看不懂的字串(密文)的過程,解密是拿金鑰把看不懂的字串(密文)變回原字串(明文)的過程
並不是所有的字串加密完後都能解回來,主要有分為單向和雙向:
單向:只能加密不能解密。這種方法多半是使用映射法產生密文,大家比較耳熟能詳的 md5 和 sha等就是單向的。
雙向:能用key加密後也用key解回明文的,常見的SSL、SSH就是雙向。
mysql提供的加解密函式
1. MD5-- 長32個字元,以下範例插入一個加密的密碼。
INSERT INTO `MEMBER`(`PASSWD`) VALUES ( MD5('1234567') );
2. ENCRYPT-- 這是使用和 Unix 上 encrypt() 相同的函數,產生密文長度為13
他的優點是密文短,可以變動key值;缺點是如果要加密的明文太長,會只取明文前8個字元:
範例
SELECT encrypt('123456789','thekey');
輸出結果
thKcEYDVzryp
其中 'thekey' 是稱為 salt 的key,可以省略 (若salt 沒省略,長度>=2)
3. PASSWORD-- 這是MySQL預設的加密法,也用在設定使用者的密碼上面。例如設定 root 密碼
UPDATE `user` SET `Password`=Password('123456789') WHERE `User`='root';
1. 雙向中最易用的是 ENCODE 和 DECODE,他的語法:
ENCODE(str, pass_str)
DECODE(crpty_str, pass_str)
其中 pass_str 就是 key 值
這兩個函數使用有1個限制:儲存密文的欄位(以上例crpty_str)一定要為 BLOB,因為密文是二進制字串
範例,用my_key 加密 my_string
SELECT encode('my string', 'my_key') ;
2. AES_ENCRYPT(), AES_DECRYPT()
AES_ENCRYPT(str,key_str)
AES_DECRYPT(crypt_str,key_str)
3. DES_ENCRYPT(), DES_DECRYPT()
參考資料
[1] https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_encrypt
編修自原文 2010-02-09 06:47:25