Làm cách nào để mã hóa chuỗi giải mã trong MySQL?

Mike Benshoof2022-09-20T08. 01. 35-04. 00

Tác giả Mike Benshoof Thông tin chi tiết về DBA, MySQL, Phần mềm Percona, Bảo mật mã hóa, MySQL, mysql và các biến thể

Làm cách nào để mã hóa chuỗi giải mã trong MySQL?
Trong một
bài đăng được viết vào đầu năm nay – Máy chủ Percona cho các lựa chọn và tùy chọn mã hóa MySQL – < . Là một chủ đề phức tạp như vậy, bài đăng đó nhằm làm rõ và làm nổi bật các khía cạnh khác nhau của “mã hóa” ở các cấp độ khác nhau. Gần đây tôi lại thấy chủ đề này xuất hiện, nhưng cụ thể là xung quanh mã hóa cấp độ cột và các tùy chọn khác nhau nên tôi muốn đề cập chi tiết hơn về vấn đề này.  I discussed some of the options around encryption in MySQL.  Being such a complex topic, that post was meant to clarify and highlight various aspects of “encryption” at different levels.  I recently had this topic come up again, but specifically around column-level encryption and various options so I wanted to touch on this in more detail.

Kể từ bản phát hành hiện tại của Máy chủ Percona dành cho MySQL, không có cách tích hợp nào để xác định một cột duy nhất là được mã hóa. Lý tưởng nhất là có thể có một số siêu dữ liệu được chuyển trong câu lệnh tạo và điều này sẽ tự động xảy ra, chẳng hạn như điều này

TẠO BẢNG pii_data (

user_id int KHÓA CHÍNH không dấu,

super_secret  varchar(255) ĐƯỢC MÃ HÓA,

… ) ĐỘNG CƠ=InnoDB

Rất tiếc, tùy chọn này không khả dụng và chúng tôi cần thực hiện một số thao tác dữ liệu vào hoặc trước thời điểm đọc/ghi

Chức năng mã hóa MySQL tích hợp

Một trong những cách tiếp cận phổ biến nhất là sử dụng các chức năng mã hóa MySQL tích hợp được mô tả tại đây. https. // nhà phát triển. mysql. com/doc/refman/8. 0/vi/hàm mã hóa. html. Các luồng tiêu chuẩn trông giống như thế này.

CHÈN VÀO mytable (id, secret_data)  VALUES (1, TO_BASE64(AES_ENCRYPT(“dữ liệu cực kỳ bí mật”, “khóa của tôi”)));

MySQL cho phép mã hóa và giải mã dữ liệu bằng thuật toán AES (Advanced Encryption Standard) chính thức

Hàm AES_ENCRYPT() mã hóa chuỗi bằng khóa đã chỉ định và trả về dữ liệu được mã hóa ở định dạng nhị phân. Chúng tôi sử dụng hàm HEX() để chuyển đổi dữ liệu nhị phân thành chuỗi thập lục phân có thể đọc được

SELECT HEX(AES_ENCRYPT('Hello', 'ycGNDx5oT1oyED0J'));

Hàm AES_DECRYPT() giải mã dữ liệu được mã hóa bằng khóa đã chỉ định và trả về chuỗi văn bản gốc. Chúng tôi lưu trữ dữ liệu được mã hóa dưới dạng chuỗi thập lục phân. Bằng cách sử dụng hàm UNHEX(), chuỗi thập lục phân được chuyển đổi thành dữ liệu nhị phân

SELECT AES_DECRYPT(UNHEX('925F31F2F7F9679EB9896462A99F5AEC'), 'ycGNDx5oT1oyED0J');

Theo mặc định, các hàm AES_ENCRYPT()AES_DECRYPT() sử dụng độ dài khóa 128 bit và chế độ ECB. Nếu khóa được chỉ định quá nhỏ, nó sẽ được đệm rỗng

Các hàm này chấp nhận một vectơ khởi tạo (IV) làm đối số tùy chọn thứ ba. IV là bắt buộc đối với một số chế độ mã hóa khối

MySQL ENCRYPT() mã hóa một chuỗi bằng lệnh gọi hệ thống Unix crypt(). Hàm trả về một chuỗi nhị phân

Vì chức năng này dựa trên lệnh gọi hệ thống Unix crypt() nên trên hệ thống Windows, nó sẽ trả về NULL

cú pháp

ENCRYPT(string, salt)

Tranh luận

NameDescriptionstringMột chuỗi sẽ được mã hóa. saltMột chuỗi có ít nhất hai ký tự. Nếu muối ít hơn hai ký tự, hàm sẽ trả về NULL. Nếu đối số này không được đặt, hàm sẽ sử dụng một giá trị ngẫu nhiên để mã hóa

Hàm MySQL AES_DECRYPT() giải mã một chuỗi được mã hóa bằng thuật toán AES để trả về chuỗi gốc. Nó trả về NULL nếu phát hiện dữ liệu không hợp lệ

cú pháp

AES_DECRYPT(crypt_str, key_str);

Tranh luận

NameDescriptioncrypt_strMột chuỗi được mã hóa. key_strString để sử dụng để giải mã crypt_str

Sơ đồ cú pháp

Làm cách nào để mã hóa chuỗi giải mã trong MySQL?

Phiên bản MySQL. 5. 6


Thí dụ

Mã số

SELECT   AES_DECRYPT(AES_ENCRYPT('mytext','mykeystring'),
'mykeystring');

Giải trình

Câu lệnh MySQL ở trên giải mã chuỗi 'mytext' được mã hóa bằng mykeystring và trả về chuỗi gốc mytext

Đầu ra mẫu

mysql> SELECT AES_DECRYPT(AES_ENCRYPT('mytext','mykeystring'),'mykeystring');
+----------------------------------------------------------------+
| AES_DECRYPT(AES_ENCRYPT('mytext','mykeystring'),'mykeystring') |
+----------------------------------------------------------------+
| mytext                                                         | 
+----------------------------------------------------------------+
1 row in set (0.00 sec)

bảng mẫu. bảng kiểm tra


Mã số

SELECT description, AES_DECRYPT(description,'passw') 
FROM testtable;

Giải trình

Câu lệnh MySQL ở trên truy xuất dữ liệu được giải mã từ cột 'mô tả' được mã hóa từ 'bảng kiểm tra'

Làm cách nào để mã hóa một chuỗi trong MySQL?

Hàm AES_ENCRYPT của MySQL được sử dụng để mã hóa chuỗi bằng thuật toán Tiêu chuẩn mã hóa nâng cao (AES). Hàm MySQL AES_ENCRYPT mã hóa dữ liệu với độ dài khóa 128 bit nhưng nó có thể được mở rộng lên tới độ dài khóa 256 bit. Nó mã hóa một chuỗi và trả về một chuỗi nhị phân.

Làm cách nào để giải mã chuỗi trong MySQL?

Hàm DES_DECRYPT của MySQL được sử dụng để giải mã chuỗi được mã hóa bằng thuật toán DES (Chuẩn mã hóa dữ liệu). Hàm MySQL DES_DECRYPT sử dụng khóa để giải mã chuỗi. Giá trị được trả về bởi hàm DES_DECRYPT là một chuỗi được giải mã hoặc NULL.

Làm cách nào để sử dụng mã hóa trong MySQL?

Để kích hoạt mã hóa cho vùng bảng hệ thống mysql, chỉ định tên vùng bảng và tùy chọn ENCRYPTION trong câu lệnh ALTER TABLESPACE . mysql> THAY ĐỔI TABLESPACE mysql ENCRYPTION = 'Y'; .

Làm cách nào để giải mã mã hóa AES trong MySQL?

Hàm MySQL AES_DECRYPT trả về chuỗi gốc sau khi giải mã chuỗi được mã hóa. Nó sử dụng thuật toán AES (Advanced Encryption Standard) để thực hiện giải mã. Hàm AES_DECRYPT trả về chuỗi đã giải mã hoặc NULL nếu phát hiện dữ liệu không hợp lệ