Mã hóa dữ liệu là sử dụng một phương pháp biến đổi dữ liệu từ dạng bình thường sang một dạng khác, mà người không có thẩm quyền hay phương tiện giải mã thì không thể đọc hiểu được.
Giải mã dữ liệu là quá trình sử dụng một phương pháp biến đổi dữ liệu đã được mã hóa về dạng thông tin ban đầu.
Hình 3.1. Quy trình mã hóa và giải mã dữ liệu [6] Phân mức mã hóa
Mã hóa mức lưu trữ: Thực hiện mã hóa dữ liệu trong các hệ thống lưu
trữ để bảo vệ dữ liệu. Mã hóa mức lưu trữ sử dụng trong mã hóa các tập tin, thư mục dữ liệu trong môi trường hệ điều hành. Mã hóa mức lưu trữ giúp bảo vệ dữ liệu mà không phải thay đổi ứng dụng đang có. Mã hóa mức lưu trữ không quan tâm đến cấu trúc dữ liệu, do đó, mức độ nhạy cảm của dữ liệu không ảnh hưởng khi thực hiện. Vấn đề là phải lựa chọn các tập tin sẽ được mã hóa để đảm bảo thông tin nhạy cảm không bị rò rỉ.
Hình 3.2. Mô tả mã hóa mức lưu trữ [22]
yêu cầu về độ nhạy cảm của dữ liệu hay phân quyền người sử dụng. Mã hóa mức CSDL có thể thực hiện linh hoạt với bảng, cột hay dòng dữ liệu. Tùy thuộc vào mức độ hỗ trợ của DBMS, để thực hiện mã hóa mức CSDL có thể phải thay đổi ứng dụng đang có. Hơn nữa, mã hóa mức CSDL có thể làm giảm hiệu năm của DBMS.
Thực hiện mã hóa mức CSDL tức là dữ liệu được giải mã tại máy chủ CSDL. Tức là, máy chủ phải lưu trữ bản mã, các Khóa mã hóa. Do đó, khi kẻ tấn công chiếm được quyền quản trị máy chủ thì cũng có thể chiếm quyền sử dụng các bản mã và Khóa mã hóa để đánh cắp dữ liệu.
Hình 3.3. Mô tả mã hóa mức CSDL [22]
Mã hóa mức ứng dụng: Thực hiện quá trình mã hóa/giải mã trên ứng
dụng để xử lý dữ liệu. Mã hóa được thực hiện trên ứng dụng rồi đưa vào hệ thống. Dữ liệu mã hóa được hệ thống lưu trữ và được giải mã trên ứng dụng. Phương pháp này có lợi ích là tách biệt Khóa (trên ứng dụng) và dữ liệu được mã hóa (lưu trong CSDL). Tuy nhiên, để áp dụng thì ứng dụng phải viết lại. Ngoài ra, tùy thuộc vào mức độ mã hóa, khi lấy dữ liệu, ứng dụng có thể lấy thừa dữ liệu từ CSDL, do đó làm giảm tính an toàn. Trong một số trường hợp, để tối ưu, mã hóa có thể thực hiện nhờ các hàm lưu sẵn trong DBMS để giảm tải cho ứng dụng. Khi đó, với cơ chế quản lý khóa của DBMS, mã hóa mức ứng dụng có thể được thực hiện linh hoạt, tùy thuộc vào sự hợp lý của ứng dụng đang sử dụng.
Hình 3.4. Mô tả mã hóa mức ứng dụng [22] 3.4.1. Hệ thống phân cấp khóa trong SQL Server[17]
Trong quá trình mã hóa, hàm mã hóa sử dụng một khóa để mã hóa dữ liệu, và đó là thông tin xác định kết quả bản mã. Khóa đảm bảo rằng các kết quả của việc mã hóa sẽ không chỉ phụ thuộc vào các thuật toán mã hóa. Trong thực tế, khóa là yếu tố quan trọng của mã hóa. Chất lượng của khóa thể hiện độ khó để giải mã dữ liệu khi không có khóa mà không giữ bí mật thuật toán.
Vì vậy, khóa là yếu tố bí mật của thuật toán mã hóa. Một khóa được người dùng tạo ra phải có đủ độ dài để ngăn chặn việc tìm kiếm tất cả các khả năng có thể của các ký tự tạo nên khóa. Hiện nay, độ dài khóa thường là giữa 128 và 2048 bit. Khóa càng dài, mã hóa càng mạnh, nhưng đây không phải là tiêu chí duy nhất. Bởi vì để mã hóa mạnh thì đòi hỏi nhiều tài nguyên hơn. Đặc biệt là trong các hệ thống CSDL mà hiệu suất mã hóa và giải mã cần được chú trọng.
Trong SQL Server chia ra làm nhiều loại khóa nhằm đáp ứng nhu cầu linh động trong việc quản lý và an toàn các khóa mã, cũng như đảm bảo hiệu năng truy xuất dữ liệu của toàn hệ thống. Hệ thống phân cấp này cung cấp một cơ sở bảo mật cao cho các dữ liệu nhạy cảm. Hệ thống phân cấp này bao gồm:
- Khóa chủ dịch vụ (Service Master Key - SMK) - Khóa chủ CSDL (Database Master Key - DMK)
- Khóa đối xứng - Khóa bất đối xứng - Chứng chỉ
Tại phía trên cùng của hệ thống phân cấp này là Khóa chủ dịch vụ (SMK), khóa này thực hiện bảo vệ Khóa chủ CSDL (DMK) tại mỗi ứng dụng CSDL trong SQL Server.
Khóa chủ CSDL (DMK) được sử dụng để mã hóa các khóa riêng như khóa bất đối xứng và chứng chỉ trong CSDL.
Khóa bất đối xứng và chứng chỉ được sử dụng để bảo vệ khóa riêng tư khác đó là khóa đối xứng và dữ liệu chứa trong CSDL.
Các khóa đối xứng trong CSDL được sử dụng để bảo vệ các khóa đối xứng khác cũng như dữ liệu trong CSDL.
Hình 3.5. Hệ thống phân cấp khóa [17] 3.4.2. Sử dụng Khóa chủ dịch vụ và Khóa chủ CSDL[10]
SQL Server cho phép tạo ra và lưu trữ các khóa mã hóa bên trong một CSDL. Khóa là bí mật và việc bảo vệ các khóa là hết sức quan trọng. Một phương pháp tốt để làm điều đó là mã hóa các khóa sử dụng khóa khác.
Trong SQL Server, khóa này được gọi là khóa chính (khóa chủ). Mỗi CSDL có khóa chủ riêng của mình, và các khóa chủ CSDL đó lần lượt được
mã hóa bằng một khóa chủ máy chủ. Khóa chủ cũng mã hóa một số thông tin nhạy cảm khác, chẳng hạn như mật khẩu nhập vào, các tùy chọn kết nối máy chủ liên kết.
Trước khi một khóa có thể được sử dụng trong SQL Server, nó phải được mở ra. Điều này có nghĩa là khóa được đọc từ một bảng hệ thống và giải mã. Sau khi sử dụng, các khóa được đóng lại, bằng cách sử dụng một lệnh CLOSE.
a. Khóa chủ dịch vụ (Service Master Key – SMK): là gốc của hệ thống
phân cấp mã hóa được tạo ra tự động khi SQL Server cần để mã hóa cho lần đầu tiên.
Để sao lưu khóa SMK, sử dụng lệnh sau:
BACKUP SERVICE MASTER KEY TO FILE = “e:\encryption_keys\smk.key” ENCRYPTION BY PASSWORD = “Mật khẩu”;
Để khôi phục lại khóa SMK, sử dụng lệnh sau:
RESTORE SERVICE MASTER KEY FROM FILE = “e:\encryption_keys\smk.key”
DENCRYPTION BY PASSWORD = “Mật khẩu”;
Có thể quyết định tạo lại khóa SMK như một phần trong chính sách an toàn. Nó sẽ thực hiện giải mã và mã hóa lại các khóa mà được bảo vệ bởi SMK. Để tạo lại khóa SMK, sử dụng lệnh sau:
ALTER SERVICE MASTER KEY REGENERATE
b. Khóa chủ CSDL (Database Master Key - DMK): Khóa DMK phải
được tạo bên trong CSDL. Phải cung cấp một mật khẩu đáp ứng các yêu cầu chính sách mật khẩu Windows của máy tính đang chạy SQL Server. Hai bản sao của khóa DMK được giữ lại:
- Một bản sao được lưu trong CSDL đó
- Một bản sao còn lại được lưu trong CSDL master
Khóa DMK được bảo vệ bởi khóa SMK. Điều này cho phép khóa DMK được mở tự động. Đây là một điều tiện dụng bởi vì khi đó không cần mở khóa trong mã lệnh, nhưng nó cũng có nghĩa là bất kỳ người sử dụng CSDL nào cũng có thể sử dụng khóa này.
CREATE MASTER KEY
ENCRYPTION BY PASSWORD = ‘Mật khẩu’;
Để xem một CSDL có khóa DMK được mã hóa bởi SMK hay không, thực hiện truy vấn sau:
SELECT name, is_master_key_encrypted_by_server FROM sys.databases
ORDER BY name;
Để biết CSDL của mình có DMK, xem sys.symetric_keys bằng cách thực hiện truy vấn sau:
SELECT *
FROM sys.symmetric_keys
WHERE symmetric_key_id =101;
Khóa DMK là một khóa đối xứng và nó luôn nhân ID là 101 trong
CSDL. Khóa DMK luôn có tên là ###MS_DatabaseMasterKey###.
Điều quan trọng là cần phải sao lưu các khóa mã này, sử dụng lệnh sau:
OPEN MASTER KEY
DECRYPTION BY PASSWORD = ‘a very strong password’; BACKUP MASTER KEY TO FILE = ‘e:\encyption_keys\dmk.key’ ENCRYPTION BY PASSWORD = ‘new strong password’
CLOSE MASTER KEY;
Để khôi phục khóa DMK từ tập tin, thực hiện lệnh sau:
RESTORE MASTER KEY FROM FILE = ‘e:\encryption_keys\dmk.key’ DECRYPTION BY PASSWORD = ‘new strong password’
ECRYPTION BY PASSWORD = ‘new very strong password’
Để tạo một bản sao của DMK được bảo vệ bằng SMK và lưu nó trong CSDL hiện hành và CSDL master, thực hiện lệnh sau:
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY;
Trong một số trường hợp, có thể yêu cầu hạn chế truy cập chỉ để những người dùng cung cấp mật khẩu. Để làm điều đó, loại bỏ việc bảo vệ SMK, cụ thể việc này như sau:
Để loại bỏ việc bảo vệ DMK bởi SMK, thực hiện lệnh sau:
ALTER MASTER KEY
DROP ENCRYPTION BY SERVICE MASTER KEY;
Để xóa bỏ khóa DMK, thực hiện lệnh sau:
DROP MASTER KEY;
3.4.3. Mã hóa sử dụng khóa đối xứng[10]
Mục đích chính của các khóa là mã hóa dữ liệu, chẳng hạn như giá trị cột. Để làm điều đó trong SQL Server là sử dụng khóa đối xứng, bởi vì mã hóa bất đối xứng và giải mã chậm hơn đáng kể, ngay cả với một số lượng tương đối nhỏ dữ liệu cần xử lý.
SQL Server hỗ trợ tương đối nhiều các thuật toán mã hóa sử dụng khóa đối xứng, như: DES, 3DES, 3DES_3KEY, RC2, RC4, RC4_128, DESX, AES_128, AES_192, AES_256.
Để bảo vệ khóa, cần mã hóa nó với một khóa khác hoặc với một mật khẩu mạnh. Một khóa có thể được bảo vệ bởi một số thao tác mã hóa. Ví dụ, có thể mã hóa một khóa đối xứng bởi một mật khẩu và một khóa bất đối xứng. Khi đó, để mở nó, cần phải cung cấp chỉ một trong số chúng. Điều này có ích khi cung cấp các phương pháp để giải mã một số dữ liệu cho người sử dụng khác nhau bằng cách sử dụng cùng khóa, nhưng với mật khẩu cá nhân. Nếu một người sử dụng cần bị từ chối truy cập trong tương lai, thì chỉ phải gỡ bỏ mật khẩu từ khóa đó. Điều này được thể hiện trong đoạn mã sau:
CREATE SYMMETRIC KEY UserSKey WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = 'Password for Fred', PASSWORD = 'Password for Mary' ;
OPEN SYMMETRIC KEY UserSKey
DECRYPTION BY PASSWORD = 'Password for Fred' ; ALTER SYMMETRIC KEY UserSKey
DROP ENCRYPTION BY PASSWORD = 'Password for Fred' ; CLOSE SYMMETRIC KEY UserSKey ;
được cung cấp. Để ngăn chặn Fred mở khóa, một người quản trị (là người biết
được mật khẩu của Fred và có quyền ALTER trên khóa) có thể mở khóa và sử dụng lệnh ALTER SYMMETRIC KEY để loại bỏ mật khẩu.
Xem sys.openkeys sẽ cho biết các khóa được mở cho phiên hiện tại.
Khóa được lưu trong CSDL mà nó được tạo ra. Để mở và sử dụng khóa, phải ở trong ngữ cảnh CSDL đó. Nếu cố gắng để mở một khóa trong ngữ cảnh CSDL sai, thì sẽ nhận được một thông báo lỗi ‘object not found’. Nếu mở thành công một khóa, sau đó thay đổi ngữ cảnh CSDL và cố gắng mã hóa một cái gì đó thì sẽ nhận được kết quả NULL. Trong mã hóa đối xứng, việc mã hóa và giải mã sử dụng cùng một khóa, đôi khi có thể muốn gửi khóa này đến máy chủ khác để trao đổi các thông tin được mã hóa. Không có cách nào để sao lưu hoặc trích xuất một khóa đối xứng tạo ra trong SQL Server vào một tập tin, nhưng có thể tạo lại khóa này trên một máy chủ khác. Để thực hiện
điều này,sử dụng tùy chọn KEY_SOURCE và IDENTITY_VALUE khi tạo
khóa như sau:
CREATE SYMMETRIC KEY SKeyToShare WITH ALGORITHM = AES_256,
KEY_SOURCE = 'a complex passphrase #1', IDENTITY_VALUE = 'a complex passphrase #2'
ENCRYPTION BY PASSWORD = 'a complex passphrase #3';
Hai khóa đối xứng tạo ra với cùng KEY_SOURCE và
IDENTITY_VALUE là giống hệt nhau, và chúng có thể được sử dụng thay thế
cho nhau. Ở đây, các khóa được bảo vệ bằng mật khẩu, nhưng cũng có thể bảo vệ chúng với một khoá bất đối xứng hoặc chứng chỉ.
Khi mở khóa bằng lệnh OPEN SYMMETRIC KEY, khóa này sẽ được
duy trì đến khi đóng nó hoặc phiên này kết thúc.
Nếu muốn mở một khóa cho một phiên hoặc tất cả các phiên, mà không cần đặt bất kỳ lệnh nào trong mã lệnh của mã khách hàng thì thực hiện lệnh
OPEN SYMMETRIC KEY trong sự kiện kích hoạt đăng nhập. Khi đó có thể
chèn lệnh OPEN SYMMETRIC KEY trong thủ tục lưu trữ với ngữ cảnh thực hiện là OWNER hoặc SELF để ẩn mật khẩu từ người dùng. Khóa sẽ được mở
ra trong thủ tục và sẽ duy trì cho đến khi phiên kết thúc. Tất nhiên, việc thực hiện an toàn tốt nhất là không giữ việc mở khóa trong thời gian dài hơn mức
try/catch để đảm bảo rằng các khóa đã được đóng ngay cả trường hợp có lỗi xảy ra, như trong ví dụ sau:
BEGIN TRY
OPEN SYMMETRIC KEY UserSKey
DECRYPTION BY PASSWORD = 'I am for Fred';
/* Thực hiện các công việc tại đây */ ……
CLOSE SYMMETRIC KEY UserSKey; END TRY
BEGIN CATCH
IF EXISTS (SELECT * FROM sys.openkeys WHERE key_name = 'UserSKey') CLOSE SYMMETRIC KEY UserSKey;
END CATCH
3.4.4. Mã hóa sử dụng khóa bất đối xứng[10]
Một khóa bất đối xứng là một cặp khóa, gồm một khóa công khai để mã hóa dữ liệu và một khóa bí mật để giải mã dữ liệu được mã hóa bởi khóa công khai đó.
Trong SQL Server, để sử dụng khóa bất đối xứng, cần phải tạo Khóa chủ CSDL (DMK) trước. Vì khóa bất đối xứng được mã hóa bởi DMK. Tuy nhiên, nếu CSDL không có DMK, vẫn có thể tạo các khóa bất đối xứng nhưng phải bảo vệ chúng bằng mật khẩu.
Để tạo một khóa bất đối xứng, một cách đơn giản nhất, thực hiện lệnh như sau:
CREATE ASYMMETRIC KEY EmployeeSalaryASKey WITH ALGORITHM =RSA_2048
Trong lệnh này không cung cấp mật khẩu. Khi tạo một khóa bất đối xứng mà không cung cấp mật khẩu thì khóa riêng sẽ được mã hóa bằng khóa DMK.
Để thấy những khóa đang tồn tại trong CSDL hiện tại, có thể xem
sys.asymmetric_keys, như sau:
Thuật toán mật mã được sử dụng cho khóa bất đối xứng là RSA (được đặt theo tên của 3 người tạo ra thuật toán: Ron Rivest, Adi Shamir, Leonard Adleman). Độ dài khóa ở đây chọn là 2048 bit.
3.4.5. Sử dụng Chứng chỉ[10]
Chứng chỉ là một chìa khóa bất đối xứng, có thông tin nhận dạng được gắn với nó. Có thể xem nó như là một chìa khóa với tên của chủ sở hữu khắc trên đó.
Chứng chỉ cho phép không chỉ lưu trữ trao đổi dữ liệu được mã hóa, mà còn để đảm bảo người nhận (khóa riêng, mà sẽ được sử dụng để giải mã) đúng người, bằng một chữ ký số.
Chứng chỉ phải được ký. Một chữ ký số chứng minh tính xác thực của các chứng chỉ, cần phải đến từ một cơ quan đáng tin cậy. Cơ quan này được gọi là Nhà cung cấp chứng chỉ số (Certificate Authority - CA).
Chứng chỉ cũng có thể tự ký, có nghĩa là các thực thể sử dụng chứng chỉ là cùng một thực thể đã ký nó (chứng chỉ được ký với khóa riêng của nó). Điều này không cung cấp bất kỳ đảm bảo thực cho các bên khác, nhưng có lợi thế là miễn phí và dễ dàng để tạo ra.
Trong SQL Server, các Chứng chỉ tự ký có thể được sử dụng thay cho Khóa bất đối xứng.
Để có các chứng chỉ được mã hóa bởi DMK, phải tạo DMK trước. Nếu CSDL không có khóa DMK, vẫn có thể tạo chứng chỉ nhưng nó sẽ được bảo vệ bởi mật khẩu.
Đoạn mã sau mô tả cách tạo một chứng chỉ tự ký (Self-signed Certificate) được bảo vệ bằng mật khẩu.
CREATE CERTIFICATE HumanResourceCert
ENCRYPTION BY PASSWORD = 'I am a very strong password' WITH SUBJECT = 'DataHero Human Resources',
EXPIRY_DATE = '20131231';
Có thể đưa vào từ tập tin (import) một chứng chỉ đang có như sau:
CREATE CERTIFICATE HumanResourceCert
FROM FILE = 'e:\encryption_keys\HumanResourceCert.cer'
DECRYPTION BY PASSWORD = 'the password set at backup');
Để nhận biết được các khóa có tồn tại trong CSDL hiện tại, thực hiện truy vấn như sau:
SELECT * FROM sys.certificates;
Có thể sử dụng hàm CertProperty() để lấy thông tin chứng chỉ:
SELECT CertProperty(Cert_Id('HumanResourceCert'), 'Expiry_Date');
Các chứng chỉ được dùng trong SQL Server tuân theo chuẩn X.509v3, được mô tả trong IETF RFC 5280, và sử dụng thuật toán RSA. Khóa riêng có độ dài 1024 bit. Khi import một chứng chỉ từ tập tin, thì tập tin đó có định