Mã hóa dữ liệu quan trọng trong Microsoft SQL Server


Chào các bạn,

Như bài viết trước, tôi đã trình bày cách mã hóa dữ liệu file backup( *.BAK). Tiếp theo tôi sẽ trình bày cách mã hóa dữ liệu lưu trữ trong Database như thế nào.

Hiện nay khi nhà phát triển phần mềm trên mỗi trường Internet, ứng dụng Windows và ứng dụng web không tránh khỏi “Bug”. Tin tặc có thể lợi dụng các Bug này dùng SQL Injection truy cập vào hệ thống các bạn trái phép. Thông qua đó tin tặc sẽ lấy nhiều thông tin có lợi như : Số tài khoản, mật khẩu, Email v.v.v.

Thường thì thông tin đăng nhập vào hệ thống (Password) được các nhà lập trình lưu lại trong Database dưới dạng text và được mã hóa bằng các thuật toán mã hóa đơn giản.

Phòng ngừa các trường hợp xấu nhất có thể xảy ra, tin tặc có thể lấy đi Database của bạn nhưng dữ liệu đã được mã hóa một cách an toàn bằng chính các thuật toán mã hóa đã được chứng nhận trên thế giới.

1. Tạo database và table chứa thông tin đăng nhập
Chúng ta có thể tạo Database bằng DDL hoặc dùng công cụ của Microsoft
CREATE DATABASE [EncryptData]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N’EncryptData’, FILENAME = N’C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\EncryptData.mdf’ , SIZE = 4096KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N’EncryptData_log’, FILENAME = N’C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\EncryptData_log.ldf’ , SIZE = 1024KB , FILEGROWTH = 10%)
GO
ALTER DATABASE [EncryptData] SET COMPATIBILITY_LEVEL = 110
GO
ALTER DATABASE [EncryptData] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [EncryptData] SET ANSI_NULLS OFF
GO
ALTER DATABASE [EncryptData] SET ANSI_PADDING OFF
GO
ALTER DATABASE [EncryptData] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [EncryptData] SET ARITHABORT OFF
GO
ALTER DATABASE [EncryptData] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [EncryptData] SET AUTO_CREATE_STATISTICS ON
GO
ALTER DATABASE [EncryptData] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [EncryptData] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [EncryptData] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [EncryptData] SET CURSOR_DEFAULT GLOBAL
GO
ALTER DATABASE [EncryptData] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [EncryptData] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [EncryptData] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [EncryptData] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [EncryptData] SET DISABLE_BROKER
GO
ALTER DATABASE [EncryptData] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [EncryptData] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [EncryptData] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [EncryptData] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [EncryptData] SET READ_WRITE
GO
ALTER DATABASE [EncryptData] SET RECOVERY FULL
GO
ALTER DATABASE [EncryptData] SET MULTI_USER
GO
ALTER DATABASE [EncryptData] SET PAGE_VERIFY CHECKSUM
GO
ALTER DATABASE [EncryptData] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
USE [EncryptData]
GO
IF NOT EXISTS (SELECT name FROM sys.filegroups WHERE is_default=1 AND name = N’PRIMARY’) ALTER DATABASE [EncryptData] MODIFY FILEGROUP [PRIMARY] DEFAULT
GO
01

Tạo table :[Account] bằng DDL hoặc Tools

USE [EncryptData]
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Account](
[UserID] [nvarchar](50) NOT NULL,
[UserName] [nvarchar](50) NULL,
[Password] [nvarchar](50) NULL,
[BankAccount] [nvarchar](50) NULL,
CONSTRAINT [PK_Account] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

02

2. Tạo bộ keys mã hóa

·Tạo password Encryption :
IF NOT EXISTS
(SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
CREATE MASTER KEY ENCRYPTION BY
PASSWORD = ‘23987hxJKL969#ghf0%94467GRkjg5k3fd117r$$#1946kcj$n44nhdlj’
GO

·Tạo Certificate
CREATE CERTIFICATE IMS_ENCRYPT
WITH SUBJECT = ‘EncryptData’;
GO

·Tạo Symmetric key
CREATE SYMMETRIC KEY SSN_Key_EncryptData
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE ENCRYPTDATA;

·Insert dữ liệu
OPEN SYMMETRIC KEY SSN_Key_EncryptData
DECRYPTION BY CERTIFICATE ENCRYPTDATA;
Insert into EncryptData.dbo.Account(UserID,UserName,Password,BankAccount)
values(‘001’,EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘dangvinhcuong1’), EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘123’),
EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘0123456789’))
Insert into EncryptData.dbo.Account(UserID,UserName,Password,BankAccount)
values(‘002’,EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘dangvinhcuong2’), EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘123’),
EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘0123456789’))
Insert into EncryptData.dbo.Account(UserID,UserName,Password,BankAccount)
values(‘003’,EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘dangvinhcuong3’), EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘123’),
EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘0123456789’))
Insert into EncryptData.dbo.Account(UserID,UserName,Password,BankAccount)
values(‘004’,EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘dangvinhcuong4’), EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘123’),
EncryptByKey(Key_GUID(‘SSN_Key_EncryptData’), ‘0123456789’))

Sau khi Insert vào database, bạn sẽ thấy dữ liệu của bạn được mã hóa, ở đây mình mã hóa tất cả các column loại trừ column “UserID”

04

·Giải mã dữ liệu
OPEN SYMMETRIC KEY SSN_Key_EncryptData
DECRYPTION BY CERTIFICATE ENCRYPTDATA
go
select Userid, convert (varchar, decryptbykey(UserName)) as ‘UserName’,
convert (varchar, decryptbykey(Password)) as ‘Password’ from EncryptData.dbo.Account

Lưu ý:

Bạn nên viết store procedure để insert dữ liệu thông qua đó ta có thể mã hóa store procedure luôn.

Ngoài ra bạn cũng cấp quyền cho Symmetric key và Certificate

.03

=> Kết luận, chúng ta có thể mã hóa dữ liệu quan trọng hai lần, lần đầu ở tầng Application bạn có thể mã hóa bằng các thuật toán của bạn. Lần hai mã hóa bằng Symmetric và Certificate như trên mình đã giới thiệu.

Các bạn đừng quên backup Symmetric keys và Certificate nhé

Chúc các bạn thành công.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s