需求:对用户表的 id_card 加密存储
表结构:
CREATE TABLE `test_user` (
`user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`id_card` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`id_card`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
其中,id_card 是主键 key。
需要使用到的函数:HEX(), UNHEX(), AES_ENCRYPT(), AES_DECRYPT()。
HEX():十六进制化函数。
AES_ENCRYPT(str,key_str):加密函数。其中,str是需要加密的内容,key_str是秘钥,可以是随意的字符串,自己设定。
AES_DECRYPT(crypt_str,key_str):解密函数。其中,crypt_str是需要解密的内容,key_str是秘钥,需要使用和加密函数一样的秘钥才能解密成功。
插入数据SQL:(其中,"AABBCCDD" 是自定义的秘钥串)
INSERT INTO test_user ( user_name, id_card )
VALUES
( '张学友', HEX( AES_ENCRYPT ( '450521199900000000', 'AABBCCDD' ) ) );
查询SQL:
SELECT
user_name,
AES_DECRYPT( UNHEX( id_card ), 'AABBCCDD' )
FROM
test_user;
条件查询SQL:
SELECT
user_name,
AES_DECRYPT( UNHEX( id_card ), 'AABBCCDD' )
FROM
test_user
WHERE
id_card = HEX( AES_ENCRYPT ( '450521199900000000', 'AABBCCDD' ) );
至此,数据库中保存的就是加密的字符串了,如果拿不到秘钥,查询到的是一串密文。可以有效防止数据泄密。
修改旧表中未加密的数据:
UPDATE test_user
SET id_card = HEX( AES_ENCRYPT ( id_card, 'AABBCCDD' ) );