MySql字段內容加密與解密

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語句中即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章