Cách giải mã giá trị cột trong MySQL

SQL Server cung cấp các chức năng mã hóa và giải mã để bảo mật nội dung của các cột riêng lẻ. Danh sách sau đây xác định các chức năng mã hóa phổ biến

  • EncryptByKey và DecryptByKey

  • EncryptByCert và DecruptByCert

  • EncryptByPassPhrase và DecruptByPassPhrase

  • EncryptByAsymKey và DecryptByAsymKey

Bạn có thể sử dụng các chức năng này ở bất kỳ đâu trong mã của mình; . Trường hợp sử dụng phổ biến là tăng cường bảo mật thời gian chạy bằng cách mã hóa mã thông báo bảo mật của người dùng ứng dụng được chuyển dưới dạng tham số

Các chức năng này tuân theo hệ thống phân cấp mã hóa chung của SQL Server, từ đó sử dụng API bảo vệ dữ liệu của Windows Server

Mã hóa và giải mã đối xứng tiêu thụ tài nguyên tối thiểu và có thể được sử dụng cho các tập dữ liệu lớn

Phần này không đề cập đến Mã hóa dữ liệu minh bạch (TDE) hoặc mã hóa đầu cuối luôn được mã hóa

cú pháp

Ví dụ sau bao gồm cú pháp chung cho EncryptByKey và DecryptByKey

EncryptByKey (  , { 'text to be encrypted' }, { }, {  } );
DecryptByKey ( 'Encrypted Text' , , {  )

ví dụ

Ví dụ sau minh họa cách mã hóa Số an sinh xã hội của nhân viên

Ví dụ sau tạo khóa chính cơ sở dữ liệu

USE MyDatabase;
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = '';

Các ví dụ sau tạo chứng chỉ và khóa

CREATE CERTIFICATE Cert01
WITH SUBJECT = 'SSN';
CREATE SYMMETRIC KEY SSN_Key
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE Cert01;

Ví dụ sau tạo bảng nhân viên

CREATE TABLE Employees
(
    EmployeeID INT PRIMARY KEY,
    SSN_encrypted VARBINARY(128) NOT NULL
);

Mở khóa đối xứng để mã hóa

OPEN SYMMETRIC KEY SSN_Key
DECRYPTION BY CERTIFICATE Cert01;

Chèn dữ liệu được mã hóa

INSERT INTO Employees (EmployeeID, SSN_encrypted)
VALUES
(1, EncryptByKey(Key_GUID('SSN_Key') , '1112223333', 1, HashBytes('SHA1', CONVERT(VARBINARY, 1)));
SELECT EmployeeID,
CONVERT(CHAR(10), DecryptByKey(SSN, 1 , HashBytes('SHA1', CONVERT(VARBINARY, EmployeeID)))) AS SSN
FROM Employees;

EmployeeID  SSN_Encrypted              SSN
1           0x00F983FF436E32418132..  1112223333

Để biết thêm thông tin, hãy xem Mã hóa cột dữ liệu và phân cấp mã hóa trong tài liệu SQL Server

Sử dụng MySQL

Phiên bản tương thích với MySQL của Amazon Aurora (Aurora MySQL) cung cấp các chức năng mã hóa và giải mã tương tự như SQL Server với hệ thống phân cấp bảo mật đơn giản hơn nhiều và dễ quản lý hơn

Các chức năng mã hóa yêu cầu khóa thực dưới dạng chuỗi, vì vậy bạn phải thực hiện các biện pháp bổ sung để bảo vệ dữ liệu. Ví dụ: băm các giá trị chính trên máy khách

Aurora MySQL hỗ trợ các thuật toán mã hóa AES và DES. Bạn có thể sử dụng các chức năng sau để mã hóa và giải mã dữ liệu

  • DecryptByKey ( 'Encrypted Text' , , {  )
    3

  • DecryptByKey ( 'Encrypted Text' , , {  )
    4

  • DecryptByKey ( 'Encrypted Text' , , {  )
    5

  • DecryptByKey ( 'Encrypted Text' , , {  )
    6

Các hàm

DecryptByKey ( 'Encrypted Text' , , {  )
7,
DecryptByKey ( 'Encrypted Text' , , {  )
8,
DecryptByKey ( 'Encrypted Text' , , {  )
9 và
USE MyDatabase;
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = '';
0 không được dùng nữa bắt đầu từ MySQL phiên bản 5. 7. 2 và 5. 7. 6. Mã hóa bất đối xứng không được hỗ trợ trong Aurora MySQL

Amazon Relational Database Service (Amazon RDS) cho MySQL 8 hỗ trợ chế độ FIPS nếu được biên dịch bằng OpenSSL và thư viện OpenSSL cũng như Mô-đun đối tượng FIPS có sẵn trong thời gian chạy. Chế độ FIPS áp đặt các điều kiện đối với các hoạt động mã hóa, chẳng hạn như các hạn chế đối với các thuật toán mã hóa được chấp nhận hoặc các yêu cầu đối với độ dài khóa dài hơn. Để biết thêm thông tin, hãy xem Hỗ trợ FIPS trong tài liệu MySQL

cú pháp

Ví dụ sau đây cho thấy cú pháp chung cho các chức năng mã hóa

[A|D]ES_ENCRYPT(,  [,])
[A|D]ES_DECRYPT(,  [,])

Để biết thêm thông tin, xem trong tài liệu MySQL

Rất nên sử dụng vectơ khởi tạo tùy chọn để tránh các cuộc tấn công thay thế toàn bộ giá trị. Khi mã hóa dữ liệu cột, người ta thường sử dụng khóa bất biến làm vectơ khởi tạo. Với phương pháp này, quá trình giải mã không thành công nếu toàn bộ giá trị chuyển sang hàng khác

Cân nhắc sử dụng SHA2 thay vì SHA1 hoặc MD5 vì đã có những cách khai thác đã biết dành cho SHA1 và MD5. Mật khẩu, khóa hoặc bất kỳ dữ liệu nhạy cảm nào được chuyển đến các chức năng này từ máy khách sẽ không được mã hóa trừ khi bạn đang sử dụng kết nối SSL. Một lợi ích của việc sử dụng Amazon IAM là các kết nối cơ sở dữ liệu được mã hóa bằng SSL theo mặc định

Một mẹo tôi đã sử dụng trong quá khứ là băm dữ liệu được mã hóa trước khi mã hóa nó và lưu trữ hàm băm trong một cột được lập chỉ mục. Tất nhiên, điều này chỉ hoạt động nếu bạn đang tìm kiếm trên toàn bộ giá trị;

Bạn có thể có thể mở rộng điều này bằng cách tạo một chỉ mục băm "toàn văn", nếu bạn cần, nhưng nó có thể trở nên phức tạp rất nhanh

PHỤ LỤC

Tôi đã đề xuất rằng tôi nên thêm chú thích cuối trang vào câu trả lời của mình cho mỗi cuộc tranh luận khá dài trong cuộc trò chuyện về lỗ hổng trước các cuộc tấn công từ điển, vì vậy tôi sẽ thảo luận về rủi ro bảo mật tiềm ẩn này đối với phương pháp trên

tấn công từ điển. Một cuộc tấn công từ điển là khi ai đó băm trước một danh sách các giá trị đã biết và so sánh các giá trị băm với cột được băm của bạn trong cơ sở dữ liệu. Nếu họ có thể tìm thấy kết quả khớp, thì có khả năng giá trị đã biết thực sự là giá trị đang được băm (Tuy nhiên, điều này không chắc chắn vì giá trị băm không được đảm bảo là duy nhất). Điều này thường được giảm thiểu bằng cách băm giá trị bằng một "muối" ngẫu nhiên được thêm vào hoặc thêm vào để hàm băm không khớp với từ điển, nhưng câu trả lời trên không thể sử dụng muối vì bạn mất khả năng tìm kiếm

Cuộc tấn công này nguy hiểm khi xử lý những thứ như mật khẩu. nếu bạn tạo một từ điển băm mật khẩu phổ biến, thì bạn có thể nhanh chóng tìm kiếm giá trị băm đó trong bảng và xác định người dùng có mật khẩu như vậy và trích xuất thông tin xác thực một cách hiệu quả để đánh cắp danh tính của người dùng đó

Ít nguy hiểm hơn đối với các mặt hàng có mức độ chính xác cao, như SSN, số thẻ tín dụng, GUID, v.v. (nhưng có những rủi ro khác nhau [đọc. hợp pháp] liên quan đến việc lưu trữ những thứ này, vì vậy tôi không có ý định khuyên bạn nên lưu trữ chúng)

Lý do cho điều này là để một cuộc tấn công từ điển hoạt động, bạn cần xây dựng sẵn một từ điển các giá trị có thể có và giá trị băm của chúng. Về lý thuyết, bạn có thể xây dựng một từ điển gồm tất cả các SSN có thể có (một tỷ hàng, giả sử tất cả các hoán vị định dạng đều bị xóa; hàng chục nghìn tỷ mục nhập cho thẻ tín dụng). nhưng đó thường không phải là điểm của một cuộc tấn công từ điển và về cơ bản có thể so sánh với một cuộc tấn công vũ phu khi bạn đang điều tra một cách có hệ thống mọi giá trị

Bạn cũng có thể tìm số SSN hoặc số thẻ tín dụng cụ thể, nếu bạn đang cố so khớp số SSN với một người. Một lần nữa, thường không phải là điểm tấn công từ điển, nhưng có thể thực hiện được, vì vậy nếu đây là rủi ro bạn cần tránh, câu trả lời của tôi không phải là giải pháp tốt cho bạn

Vì vậy, có bạn có nó. Như với tất cả dữ liệu được mã hóa, nó thường được mã hóa vì một lý do nào đó, vì vậy hãy lưu ý về dữ liệu của bạn và những gì bạn đang cố gắng bảo vệ dữ liệu đó khỏi

Làm cách nào để giải mã dữ liệu được mã hóa 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ệ

Làm cách nào để mã hóa giá trị cột trong MySQL?

Mã hóa cấp độ cột trong MySQL .
TẠO BẢNG pii_data ( user_id int unsigned PRIMARY KEY,.
CHÈN VÀO mytable (id, secret_data) GIÁ TRỊ (1, TO_BASE64(AES_ENCRYPT(“dữ liệu siêu bí mật”, “khóa của tôi”))); .
plaintextData = “nội dung siêu bí mật”.
CHỌN secretData, key TỪ mytable;

Làm thế nào để giải mã một chuỗi?

Phương pháp giải mã. .
Tìm độ dài L của đoạn dây
Tìm giá trị trần và sàn của √Length và gán chúng cho các biến
Tạo ma trận 2D và điền vào ma trận theo các ký tự của chuỗi theo cột
Đọc ma trận theo hàng để lấy chuỗi được giải mã

Làm cách nào để truy vấn dữ liệu được mã hóa MySQL?

truy xuất TẤT CẢ các bản ghi CHỈ cho trường bạn đang tìm kiếm với id bản ghi
giải mã chúng thành một bảng tạm thời
thực hiện tìm kiếm đối với bảng đó
sử dụng id để truy xuất toàn bộ bản ghi (tất cả các trường) khớp với tiêu chí tìm kiếm
giải mã chúng và trả lại cho người dùng