데이터 베이스 MySQL 튜토리얼 AES_ENCRYPT() 및 AES_DECRYPT()를 올바르게 사용하여 MySQL을 암호화하고 해독하는 방법

AES_ENCRYPT() 및 AES_DECRYPT()를 올바르게 사용하여 MySQL을 암호화하고 해독하는 방법

May 18, 2018 pm 05:40 PM
encrypt 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: &#39;\xE3f767\x12...&#39; for column &#39;passwd&#39; at row 1 |
+---------+------+------------------------------------------------------------------------+
1 row in set (0.00 sec)
로그인 후 복사

查了一下文档,看一下这两个函数的使用:

-- 将&#39;hello world&#39;加密,密钥为&#39;key&#39;,加密后的串存在@pass中
mysql> SET @pass=AES_ENCRYPT(&#39;hello world&#39;, &#39;key&#39;); 
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, &#39;key&#39;);
+---------------------------+
| AES_DECRYPT(@pass, &#39;key&#39;) |
+---------------------------+
| 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(&#39;明文1&#39;, &#39;key&#39;), AES_ENCRYPT(&#39;text2&#39;, &#39;key&#39;), AES_ENCRYPT(&#39;明文_text3&#39;, &#39;key&#39;)); 
Query OK, 1 row affected (0.01 sec)

mysql> SELECT AES_DECRYPT(pass1, &#39;key&#39;), AES_DECRYPT(pass2, &#39;key&#39;), AES_DECRYPT(pass3, &#39;key&#39;) FROM t_passwd;
+---------------------------+---------------------------+---------------------------+
| AES_DECRYPT(pass1, &#39;key&#39;) | AES_DECRYPT(pass2, &#39;key&#39;) | AES_DECRYPT(pass3, &#39;key&#39;) |
+---------------------------+---------------------------+---------------------------+
| 明文1   | text2   | 明文_text3   |
+---------------------------+---------------------------+---------------------------+
1 row in set (0.00 sec)
로그인 후 복사

当然,属性括号内的长度要取决于明文的长度,此处明文较短,故只给了16。

方法②:

将密文十六进制化,再存入varchar/char列。

此处需要用到HEX()来存入,用UNHEX()

암호화된 암호문을 복호화한 후 NULL이 된다는 뜻입니다.


그녀가 보낸 테이블 구조를 살펴보세요:


다시 살펴보면 AES_DECRYPT() 함수를 통해 문자열을 암호화한 후 삽입했습니다. 실행이 성공한 후 경고가 표시되었습니다. </p> 쿼리 OK, 1개 행 영향, 1개 경고(0.00초)



(오류는 없지만 경고, 아마도 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(&#39;hello world&#39;, &#39;key2&#39;)));
Query OK, 1 row affected (0.00 sec)

mysql> SELECT AES_DECRYPT(UNHEX(pass1), &#39;key2&#39;) FROM t_passwd_2; 
+-----------------------------------+
| AES_DECRYPT(UNHEX(pass1), &#39;key2&#39;) |
+-----------------------------------+
| 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(&#39;text&#39;, &#39;key3&#39;);
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> SELECT AES_DECRYPT(pass, &#39;key3&#39;) FROM t_passwd_3;
+---------------------------+
| AES_DECRYPT(pass, &#39;key3&#39;) |
+---------------------------+
| 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()를 사용해야 합니다.

문자열 속성이 있는 필드를 만듭니다. 🎜🎜🎜'key2' 키를 사용하여 AES로 'hello world'를 암호화한 다음 HEX 함수를 통해 암호화된 문자열을 16진수로 변환합니다. 🎜🎜🎜마지막으로 UNHEX를 통해 암호화된 문자열을 꺼내고 AES 키 'key2'를 통해 복호화합니다. 🎜rrreee🎜 마찬가지로 일반 텍스트의 길이에 따라 AES_ENCRYPT 암호화된 문자열의 길이도 달라지므로 HEX 후속 문자열의 길이도 달라집니다. 🎜실제 사용시에는 사업성을 토대로 합리적인 가치를 평가해야 합니다. 🎜🎜🎜🎜🎜방법 ③: 🎜🎜🎜🎜🎜16진수 변환 없이 varchar에 직접 저장합니다. 🎜🎜문제의 처음으로 돌아가 보면 암호화된 문자열을 utf8 문자 집합에 저장할 수 없으며 속성이 varchar입니다. 🎜🎜사실 문자 집합을 latin1로 변경하면 됩니다. 🎜🎜🎜삽입 시 경고가 보고되지 않습니다. 🎜rrreee🎜이 방법은 아름답지만 필드 문자 세트를 latin1로 설정하기만 하면 되지만 숨겨진 위험이 발생할 수 있습니다. 🎜🎜🎜문서에 다음 문장이 기록되어 있습니다. 🎜🎜🎜많은 암호화 및 압축 기능이 문자열을 반환합니다. 결과에는 임의의 바이트 값이 포함될 수 있습니다. 이러한 결과를 저장하려면 VARBINARY 또는 BLOB 이진 문자열 데이터 유형이 있는 열을 사용하십시오. 이렇게 하면 데이터 값을 변경하는 후행 공백 제거 또는 문자 집합 변환과 관련된 잠재적인 문제를 피할 수 있습니다. 바이너리가 아닌 문자열 데이터 유형(CHAR, VARCHAR, TEXT)을 사용하는 경우 발생합니다. 일반적인 아이디어는 ③ 방법을 사용하는 경우 암호화된 문자열을 char/varchar/text 유형에 직접 저장한 다음 문자를 생성하는 것입니다. 변환할 때나 공백을 제거할 때 잠재적인 영향을 미칩니다. 🎜🎜그래서 char/varchar/text에 저장해야 한다면 ②방법을 참고하여 16진수로 변환하세요. 🎜🎜🎜또는 방법 ①과 마찬가지로 바이너리 필드에 직접 저장합니다. 🎜🎜관련 권장 사항: 🎜🎜🎜🎜PHP에서 Mcrypt 암호화 및 암호 해독 대신 OpenSSL을 사용하는 방법은 무엇입니까? 🎜🎜🎜🎜WeChat 미니 프로그램의 암호화 및 복호화 NODE-UUID 기능 소개 🎜🎜🎜🎜PHP 데이터 압축, 암호화 및 복호화(팩, 언팩)에 대한 자세한 설명🎜🎜

위 내용은 AES_ENCRYPT() 및 AES_DECRYPT()를 올바르게 사용하여 MySQL을 암호화하고 해독하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

MySQL : 쉽게 학습하기위한 간단한 개념 MySQL : 쉽게 학습하기위한 간단한 개념 Apr 10, 2025 am 09:29 AM

MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) 데이터베이스 및 테이블 작성 : CreateAbase 및 CreateTable 명령을 사용하십시오. 2) 기본 작업 : 삽입, 업데이트, 삭제 및 선택. 3) 고급 운영 : 가입, 하위 쿼리 및 거래 처리. 4) 디버깅 기술 : 확인, 데이터 유형 및 권한을 확인하십시오. 5) 최적화 제안 : 인덱스 사용, 선택을 피하고 거래를 사용하십시오.

phpmyadmin을 여는 방법 phpmyadmin을 여는 방법 Apr 10, 2025 pm 10:51 PM

다음 단계를 통해 phpmyadmin을 열 수 있습니다. 1. 웹 사이트 제어판에 로그인; 2. phpmyadmin 아이콘을 찾고 클릭하십시오. 3. MySQL 자격 증명을 입력하십시오. 4. "로그인"을 클릭하십시오.

MySQL : 세계에서 가장 인기있는 데이터베이스 소개 MySQL : 세계에서 가장 인기있는 데이터베이스 소개 Apr 12, 2025 am 12:18 AM

MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템으로, 주로 데이터를 신속하고 안정적으로 저장하고 검색하는 데 사용됩니다. 작업 원칙에는 클라이언트 요청, 쿼리 해상도, 쿼리 실행 및 반환 결과가 포함됩니다. 사용의 예로는 테이블 작성, 데이터 삽입 및 쿼리 및 조인 작업과 같은 고급 기능이 포함됩니다. 일반적인 오류에는 SQL 구문, 데이터 유형 및 권한이 포함되며 최적화 제안에는 인덱스 사용, 최적화 된 쿼리 및 테이블 분할이 포함됩니다.

MySQL을 사용하는 이유는 무엇입니까? 혜택과 장점 MySQL을 사용하는 이유는 무엇입니까? 혜택과 장점 Apr 12, 2025 am 12:17 AM

MySQL은 성능, 신뢰성, 사용 편의성 및 커뮤니티 지원을 위해 선택됩니다. 1.MYSQL은 효율적인 데이터 저장 및 검색 기능을 제공하여 여러 데이터 유형 및 고급 쿼리 작업을 지원합니다. 2. 고객-서버 아키텍처 및 다중 스토리지 엔진을 채택하여 트랜잭션 및 쿼리 최적화를 지원합니다. 3. 사용하기 쉽고 다양한 운영 체제 및 프로그래밍 언어를 지원합니다. 4. 강력한 지역 사회 지원을 받고 풍부한 자원과 솔루션을 제공합니다.

단일 스레드 레 디스를 사용하는 방법 단일 스레드 레 디스를 사용하는 방법 Apr 10, 2025 pm 07:12 PM

Redis는 단일 스레드 아키텍처를 사용하여 고성능, 단순성 및 일관성을 제공합니다. 동시성을 향상시키기 위해 I/O 멀티플렉싱, 이벤트 루프, 비 블로킹 I/O 및 공유 메모리를 사용하지만 동시성 제한 제한, 단일 고장 지점 및 쓰기 집약적 인 워크로드에 부적합한 제한이 있습니다.

MySQL 및 SQL : 개발자를위한 필수 기술 MySQL 및 SQL : 개발자를위한 필수 기술 Apr 10, 2025 am 09:30 AM

MySQL 및 SQL은 개발자에게 필수적인 기술입니다. 1.MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템이며 SQL은 데이터베이스를 관리하고 작동하는 데 사용되는 표준 언어입니다. 2.MYSQL은 효율적인 데이터 저장 및 검색 기능을 통해 여러 스토리지 엔진을 지원하며 SQL은 간단한 문을 통해 복잡한 데이터 작업을 완료합니다. 3. 사용의 예에는 기본 쿼리 및 조건 별 필터링 및 정렬과 같은 고급 쿼리가 포함됩니다. 4. 일반적인 오류에는 구문 오류 및 성능 문제가 포함되며 SQL 문을 확인하고 설명 명령을 사용하여 최적화 할 수 있습니다. 5. 성능 최적화 기술에는 인덱스 사용, 전체 테이블 스캔 피하기, 조인 작업 최적화 및 코드 가독성 향상이 포함됩니다.

MySQL의 장소 : 데이터베이스 및 프로그래밍 MySQL의 장소 : 데이터베이스 및 프로그래밍 Apr 13, 2025 am 12:18 AM

데이터베이스 및 프로그래밍에서 MySQL의 위치는 매우 중요합니다. 다양한 응용 프로그램 시나리오에서 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 1) MySQL은 웹, 모바일 및 엔터프라이즈 레벨 시스템을 지원하는 효율적인 데이터 저장, 조직 및 검색 기능을 제공합니다. 2) 클라이언트 서버 아키텍처를 사용하고 여러 스토리지 엔진 및 인덱스 최적화를 지원합니다. 3) 기본 사용에는 테이블 작성 및 데이터 삽입이 포함되며 고급 사용에는 다중 테이블 조인 및 복잡한 쿼리가 포함됩니다. 4) SQL 구문 오류 및 성능 문제와 같은 자주 묻는 질문은 설명 명령 및 느린 쿼리 로그를 통해 디버깅 할 수 있습니다. 5) 성능 최적화 방법에는 인덱스의 합리적인 사용, 최적화 된 쿼리 및 캐시 사용이 포함됩니다. 모범 사례에는 거래 사용 및 준비된 체계가 포함됩니다

SQL 데이터베이스를 구축하는 방법 SQL 데이터베이스를 구축하는 방법 Apr 09, 2025 pm 04:24 PM

SQL 데이터베이스 구축에는 10 단계가 필요합니다. DBMS 선택; DBMS 설치; 데이터베이스 생성; 테이블 만들기; 데이터 삽입; 데이터 검색; 데이터 업데이트; 데이터 삭제; 사용자 관리; 데이터베이스 백업.

See all articles