本節介紹了加密和加密值。若你想要儲存一些由可能包含任意字節值的加密函數返回的結果,使用BLOB列而不是 CHAR 或VARCHAR 列,從而避免由于結尾空格的刪除而改變一些數據值的潛在問題。
- AES_ENCRYPT(str,key_str) , AES_DECRYPT(crypt_str,key_str)
這些函數允許使用官方AES進行加密和數據加密 (高級加密標準 ) 算法, 即以前人們所熟知的 “Rijndael”。 保密關鍵字的長度為128比特,不過你可以通過改變源而將其延長到 256 比特。我們選擇了 128比特的原因是它的速度要快得多,且對于大多數用途而言這個保密程度已經夠用。
輸入參數可以為任何長度。若任何一個參數為NULL,則函數的結果也是NULL。
因為 AES 是塊級算法,使用填充將不均衡長度字符串編碼,這樣結果字符串的長度的算法為 16 * (trunc(string_length / 16) + 1)。
若 AES_DECRYPT()檢測到無效數據或不正確填充,它會返回 NULL。然而,若輸入的資料或密碼無效時, AES_DECRYPT()有可能返回一個非 NULL 值 (可能為無用信息 )。
你可以通過修改你的問詢,從而使用AES函數以加密形式來存儲數據:
INSERT INTO t VALUES (1,AES_ENCRYPT('text','password'));
AES_ENCRYPT()和AES_DECRYPT() 可以被看作MySQL中普遍通用的密碼最安全的加密函數。
- DECODE(crypt_str,pass_str)
使用 pass_str 作為密碼,解密加密字符串 crypt_str, crypt_str 應該是由ENCODE()返回的字符串。
- ENCODE(str,pass_str)
使用pass_str 作為密碼,解密 str 。 使用DECODE()解密結果。
結果是一個和str長度相同的二進制字符串。若你想要將其保留在一個列中,可使用 BLOB 列類型。
- DES_DECRYPT(crypt_str[,key_str])
使用DES_ENCRYPT()加密一個字符串。若出現錯誤,這個函數會返回 NULL。
注意,這個函數只有當MySQL在SSL 的支持下配置完畢時才會運作。請參見5.8.7節,“使用安全連接”.
假如沒有給定 key_str 參數, DES_DECRYPT() 會首先檢查加密字符串的第一個字節, 從而確定用來加密原始字符串的DES密碼關鍵字數字,之后從DES關鍵字文件中讀取關鍵字從而解密信息。為使其運行,用戶必須享有 SUPER 特權。可以選擇--des-key-file服務器指定關鍵字文件。
假如你向這個函數傳遞一個key_str 參數,該字符串被用作解密信息的關鍵字。
若 crypt_str 參數看起來不是一個加密字符串, MySQL 會返回給定的 crypt_str。
- DES_ENCRYPT(str[,(key_num|key_str)])
用Triple-DES 算法給出的關鍵字加密字符串。若出現錯誤,這個函數會返回NULL。
注意,這個函數只有當MySQL 在SSL的支持下配置完畢后才會運行。請參見5.8.7節,“使用安全連接”.
使用的加密關鍵字的選擇基于第二個到 DES_ENCRYPT()的參數,假如給定:
參數 |
說明 |
無參數 |
使用來自DES關鍵字文件的第一個關鍵字。 |
key_num |
使用DES 關鍵字文件給出的關鍵字數字(0-9)。 |
key_str |
使用給出的關鍵字字符串為 str 加密。 |
選擇--des-key-file服務器指定關鍵字文件。
返回字符串是一個二進制字符串,其中第一個字符為 CHAR(128 | key_num)。
加上 128使得識別加密關鍵字更加容易。若你使用一個字符串關鍵字,則 key_num 為127。
結果的字符串長度為 new_len = orig_len + (8-(orig_len % 8))+1。
DES關鍵字文件中的每一行都具有如下格式:
key_num des_key_str
每個key_num 必須是一個從0到0范圍內的數字。文件中行的排列順序是任意的。 des_key_str 是用來加密信息的字符串。在數字和關鍵字之間應該至少有一個空格。若你未指定任何到DES_ENCRYPT()的關鍵字參數,則第一個關鍵字為默認的使用關鍵字。
使用FLUSH DES_KEY_FILE語句,你可以讓 MySQL從關鍵字文件讀取新的關鍵字值。這要求你享有 RELOAD特權。
擁有一套默認關鍵字的一個好處就是它向應用程序提供了一個檢驗加密列值的方式,而無須向最終用戶提供解密這些值的權力。
mysql> SELECT customer_address FROM customer_table
> WHERE crypted_credit_card = DES_ENCRYPT('credit_card_number');
- ENCRYPT(str[,salt])
使用Unix crypt() 系統調用加密 str。 salt 參數應為一個至少包含2個字符的字符串。若沒有給出 salt 參數,則使用任意值。
mysql> SELECT ENCRYPT('hello');
-> 'VxuFAJXVARROc'
至少在一些系統中,ENCRYPT()除了str的前八位字符之外會忽略所有內容。這個行為由下劃線的crypt() 系統調用的執行所決定。
假如crypt()在你的系統中不可用(正如在 Windows系統), ENCRYPT() 則會始終返回NULL。鑒于這個原因,我們向你推薦使用 MD5() 或SHA1() 來代替,因為這兩個函數適合所有的平臺。
- MD5(str)
為字符串算出一個 MD5 128比特檢查和。該值以32位十六進制數字的二進制字符串的形式返回, 若參數為 NULL 則會返回 NULL。例如,返回值可被用作散列關鍵字。
mysql> SELECT MD5('testing');
-> 'ae2b1fca515949e5d54fb22b8ed95575'
這是"RSA Data Security, Inc. MD5 Message-Digest Algorithm."
假如你想要將這個值轉化為大寫字母,參見12.8節,“Cast函數和操作符”中BINARY操作符項中給出的二進制字符串轉換。
- OLD_PASSWORD(str)
當PASSWORD()的執行變為改善安全性時,OLD_PASSWORD()會被添加到 MySQL。OLD_PASSWORD()返回從前的PASSWORD()執行值( 4.1之前),同時允許你為任何4.1 之前的需要連接到你的5.1 版本MySQL服務器前客戶端設置密碼,從而不至于將它們切斷。請參見5.7.9節,“MySQL 4.1中的密碼哈希處理”。
- PASSWORD(str)
從原文密碼str 計算并返回密碼字符串,當參數為 NULL 時返回 NULL。這個函數用于用戶授權表的Password列中的加密MySQL密碼存儲
mysql> SELECT PASSWORD('badpwd');
-> '7f84554057dd964b'
PASSWORD() 加密是單向的 (不可逆 )。
PASSWORD() 執行密碼加密與Unix 密碼被加密的方式不同。請參見ENCRYPT()。
注釋: PASSWORD()函數在MySQL服務器中的鑒定系統使用;你不應將它用在你個人的應用程序中。為達到同樣目的,可使用 MD5()或SHA1() 代替。 更多關于在您的應用程序中處理密碼及安全鑒定的信息見RFC 2195
- SHA1(str) SHA(str)
為字符串算出一個 SHA1 160比特檢查和,如RFC 3174 (安全散列算法 )中所述。該值被作為40位十六進制數字返回,而當參數為NULL 時則返回 NULL。這個函數的一個可能的用處就在于其作為散列關鍵字。你也可以將其作為存儲密碼的密碼安全函數使用。
mysql> SELECT SHA1('abc');
-> 'a9993e364706816aba3e25717850c26c9cd0d89d'
SHA1()可以被視為一個密碼更加安全的函數,相當于 MD5()。 SHA() 和SHA1()具有相同的意義。