집 >데이터 베이스 >MySQL 튜토리얼 >AES_ENCRYPT() 및 AES_DECRYPT()를 올바르게 사용하여 MySQL을 암호화하고 해독하는 방법
이 글에서는 MySQL에서 AES_ENCRYPT()와 AES_DECRYPT()를 사용한 올바른 암호화 및 복호화 방법을 주로 소개합니다. MySQL의 AES_ENCRYPT('password','key') 함수는 AES_DECRYPT(테이블의 필드 이름)을 암호화할 수 있습니다. ) ,'키') 함수 암호 해독 처리, 기사에서는 자세한 샘플 코드를 제공하며 도움이 필요한 친구가 이를 참조할 수 있으므로 모든 사람에게 도움이 되기를 바랍니다.
머리말
최근 직장에서 요구 사항에 직면했습니다. 일반 텍스트를 암호화하고 MySQL에 저장하려면 AES_ENCRYPT()
함수를 사용해야 하는데 몇 가지 문제가 발생했습니다.. .…아래에서 자세히 소개하겠습니다. AES_ENCRYPT()
函数将明文加密,存储在MySQL中,但是遇到了一些问题……下面就来详细介绍下。
说将加密后的密文,解密取出来是NULL。
看了一下,她发过来的表结构:
再看了她通过AES_DECRYPT()函数加密了一个字符串,然后insert进去了,执行成功后,显示了一个warning:<br>Query OK, 1 row affected, 1 warning (0.00 sec)
(没有报错而是warning,大概是sql_mode的缘故)
此时她忽略了这个warning,再通过AES_DECRYPT()
解密后,发现取出来的明文为NULL。
再回看表结构,发现其字段属性为“varchar” && 字符集是ut8,检查warning为下:
mysql> show warnings; +---------+------+------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------------------------------------+ | Warning | 1366 | Incorrect string value: '\xE3f767\x12...' for column 'passwd' at row 1 | +---------+------+------------------------------------------------------------------------+ 1 row in set (0.00 sec)
查了一下文档,看一下这两个函数的使用:
-- 将'hello world'加密,密钥为'key',加密后的串存在@pass中 mysql> SET @pass=AES_ENCRYPT('hello world', 'key'); Query OK, 0 rows affected (0.00 sec) -- 看一下加密后串的长度(都为2的整数次方) mysql> SELECT CHAR_LENGTH(@pass); +--------------------+ | CHAR_LENGTH(@pass) | +--------------------+ | 16 | +--------------------+ 1 row in set (0.00 sec) -- 使用AES_DECRYPT()解密 mysql> SELECT AES_DECRYPT(@pass, 'key'); +---------------------------+ | AES_DECRYPT(@pass, 'key') | +---------------------------+ | hello world | +---------------------------+ 1 row in set (0.00 sec)
那么到底该如何存呢?
方法①:
将字段属性设置为varbinary/binary/四个blob类型,等二进制字段属性。
创建三个字段,属性分别为varbinary、binary、blob。
并将'明文1','text2','明文_text3'加密,密钥为key,存入表中。
最后取出。
mysql> CREATE TABLE t_passwd (pass1 varbinary(16), pass2 binary(16), pass3 blob); Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t_passwd VALUES (AES_ENCRYPT('明文1', 'key'), AES_ENCRYPT('text2', 'key'), AES_ENCRYPT('明文_text3', 'key')); Query OK, 1 row affected (0.01 sec) mysql> SELECT AES_DECRYPT(pass1, 'key'), AES_DECRYPT(pass2, 'key'), AES_DECRYPT(pass3, 'key') FROM t_passwd; +---------------------------+---------------------------+---------------------------+ | AES_DECRYPT(pass1, 'key') | AES_DECRYPT(pass2, 'key') | AES_DECRYPT(pass3, 'key') | +---------------------------+---------------------------+---------------------------+ | 明文1 | text2 | 明文_text3 | +---------------------------+---------------------------+---------------------------+ 1 row in set (0.00 sec)
当然,属性括号内的长度要取决于明文的长度,此处明文较短,故只给了16。
方法②:
将密文十六进制化,再存入varchar/char列。
此处需要用到HEX()来存入,用UNHEX()
다시 살펴보면 AES_DECRYPT() 함수를 통해 문자열을 암호화한 후 삽입했습니다. 실행이 성공한 후 경고가 표시되었습니다.
(오류는 없지만 경고, 아마도 sql_mode 때문일 것임)
이때 그녀는 경고를 무시하고 AES_DECRYPT( )를 전달했습니다.
복호화 후, 꺼낸 평문이 NULL인 것으로 확인되었습니다. 테이블 구조를 다시 살펴보면 필드 속성이 "varchar" &&이고 문자 집합이 ut8임을 확인했습니다.
mysql> CREATE TABLE t_passwd_2(pass1 char(32)); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO t_passwd_2 VALUES (HEX(AES_ENCRYPT('hello world', 'key2'))); Query OK, 1 row affected (0.00 sec) mysql> SELECT AES_DECRYPT(UNHEX(pass1), 'key2') FROM t_passwd_2; +-----------------------------------+ | AES_DECRYPT(UNHEX(pass1), 'key2') | +-----------------------------------+ | hello world | +-----------------------------------+ 1 row in set (0.00 sec)
문서를 확인하고 사용 방법을 살펴보세요. 이 두 가지 기능은
mysql> CREATE TABLE t_passwd_3(pass varchar(32)) CHARSET latin1; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO t_passwd_3 SELECT AES_ENCRYPT('text', 'key3'); Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT AES_DECRYPT(pass, 'key3') FROM t_passwd_3; +---------------------------+ | AES_DECRYPT(pass, 'key3') | +---------------------------+ | text | +---------------------------+ 1 row in set (0.00 sec)그럼 어떻게 저장하나요?
방법 ①:
필드 속성을 varbinary/binary/4 blob 유형으로 설정하고 기타 바이너리 필드 속성을 설정합니다. varbinary, binary 및 blob 속성을 사용하여 세 개의 필드를 만듭니다.
'plaintext1', 'text2', 'plaintext_text3'을 키 키로 암호화하여 테이블에 저장합니다.
마지막으로 꺼내세요.
rrreee물론, 속성 괄호 안의 길이는 평문의 길이에 따라 달라집니다. 여기서 평문은 더 짧아서 16개만 주어집니다.
암호문을 16진수로 변환한 후 varchar/char 열에 저장합니다.
여기서 입금하려면 HEX()를 사용하고 출금하려면 UNHEX()
를 사용해야 합니다.
위 내용은 AES_ENCRYPT() 및 AES_DECRYPT()를 올바르게 사용하여 MySQL을 암호화하고 해독하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!