AES和DES
對於存儲在數據庫中的敏感信息,往往需要對其進行加密。MySql提供了多種加密方式,其中兩種爲AES和DES。
這兩種方式用法類似。性能上,AES各方面都略強於DES。因此推薦使用AES。
AES加密
MySql提供了2個AES加密與解密的函數:
AES_ENCRYPT('明文', 'key') // 加密
AES_DECRYPT('明文', 'key') // 解密
其中:
- 加密函數爲
AES_ENCRYPT()
,其原理是使用密鑰key
對明文進行加密,返回一個二進制字符串。這就是加密內容。 - 解密函數爲
AES_DECRYPT()
,其原理是使用密鑰key
對密文進行解密,返回明文內容。
於是,儘管數據庫中存儲的密文信息是可逆的,但必須知道密鑰才能解密。
由於AES_ENCRYPT()
返回的是二進制字符串,因此對於要進行加密的字段,需要設置其數據類型爲varbinary。
若將字段的數據類型設置爲varchar,則在做字符轉換的時或空格被刪除時可能會有問題。此時使用的一個方案是調用MySql的HEX()
將密文十六進制化再存入。對應地,取出時需要用UNHEX()
將密文進行反十六進制化。
實例
設有表格user,有3個字段:id,name,password。其中password字段需要加密存儲。
下面採用的密鑰爲coco。
直接加密存儲
將password字段的數據類型設置爲varbinary。
插入數據時調用AES_ENCRYPT()
加密:
INSERT INTO user
VALUES (1, '張三', AES_ENCRYPT(('123456'), 'coco'))
獲取數據時調用AES_DECRYPT()
解密:
SELECT id, name, AES_DECRYPT(password, 'coco') as password
FROM user
WHERE id=1
該種方式更加高效,推薦。
將密文十六進制化
將password字段的數據類型設置爲varchar。
插入數據時調用AES_ENCRYPT()
加密,然後調用HEX()
將密文十六進制化:
INSERT INTO user
VALUES (1, '張三', HEX(AES_ENCRYPT(('123456'), 'coco')))
獲取數據時先調用UNHEX()
,再調用AES_DECRYPT()
解密:
SELECT id, name, AES_DECRYPT(UNHEX(password), 'coco') as password
FROM user
WHERE id=1
該種方式效率低一點。除非必須將字段類型定義爲varchar,否則推薦使用直接加密存儲方式。
其他
兩種加密方式都支持中文。
但由於加密後整個字符串就全變成了密文,因此對於該字段的查詢只能是完全匹配,無法模糊查詢。
另外,由於這是MySql提供的函數,因此在Spring框架中開發時直接寫在對應的SQL語句中即可。