Như
bạn đã biết, mã hoá bằng mật khẩu là một phương pháp mã hoá dữ liệu cơ
bản chỉ sử dụng đến mật khẩu và có thể giải mã với cùng mật khẩu đó.
Giờ hãy giả dụ chúng ta quên mất mật khẩu đã đặt và cần phải khôi phục
lại dữ liệu như ban đầu.
Như bạn đã biết, mã hoá bằng
mật khẩu là một phương pháp mã hoá dữ liệu cơ bản chỉ sử dụng đến mật
khẩu và có thể giải mã với cùng mật khẩu đó. Giờ hãy giả dụ chúng ta
quên mất mật khẩu đã đặt và cần phải khôi phục lại dữ liệu như ban đầu.
Bước 1
Mã hoá dữ liệu theo phương pháp mã hoá bằng mật khẩu
select EncryptedData = EncryptByPassPhrase(’MAK’, ‘123456789′ )
Kết quả
EncryptedData
————————————————————————–
0×01000000F75D553409C74570F6DDBCADA53FD489DDD52D9277010050565ADF30F244F8CC
Bước 2
Tạo thủ tục sử dụng để khôi phục lại dữ liệu đã má hoá. Thủ tục này
sẽ sử dụng hàm DecryptByPassPhrase để giải mã dữ liệu và hiển thị lên
mật khẩu.
USE [Master]
GO/****** Object: StoredProcedure [dbo].[hack_encryption] Script Date: 12/18/2007 18:18:36 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N’[dbo].[hack_encryption]‘)
AND type in (N’P’, N’PC’))
DROP PROCEDURE [dbo].[hack_encryption]
GO
set nocount on
SET CONCAT_NULL_YIELDS_NULL OFF
go
USE [Master]
GO/****** Object: StoredProcedure [dbo].[hack_encryption] Script Date: 12/18/2007 18:18:55 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOCREATE procedure [dbo].[hack_encryption] @encryptedtext varbinary(max)
as
declare @password varchar(6)
declare @i int
declare @j int
declare @k int
declare @l int
declare @m int
declare @n intset @i=-1
set @j=-1
set @k=-1
set @l=-1
set @m=-1
set @n=-1
set @password =”while @i<255
begin
while @j<255
begin
while @k<255
begin
while @l<255
begin
while @m<255
begin
while @n<=255
begin
set @password=isnull(char(@i),”)
+ isnull(char(@j),”)
+isnull(char(@k),”)+ isnull(char(@l),”)
+isnull(char(@m),”) + isnull(char(@n),”)
if convert(varchar(100), DecryptByPassPhrase(ltrim(rtrim(@password)),
@encryptedtext)) is not null
begin
print ‘This is the Encrypted text:’ +@password
set @i=256;set @j=256;set @k=256;set @l=256;set @m=256;set @n=256;
print ‘The actual data is :’ +convert(varchar(100),
DecryptByPassPhrase(ltrim(rtrim(@password)), @encryptedtext))
end
–print ‘A’+ltrim(rtrim(@password))+’B’
–print convert(varchar(100), DecryptByPassPhrase(ltrim(rtrim(@password)),@encryptedtext))
set @n=@n+1
end
set @n=0
set @m=@m+1
end
set @m=0
set @l=@l+1
end
set @l=0
set @k=@k+1
end
set @k=0
set @j=@j+1
end
set @j=0
set @i=@i+1
endGO
Bước 3
Giả sử rằng bạn đã quên mật khẩu dùng để mã hoá dữ liệu thành “0×01000000F75D553409C74570F6DDBCADA53FD489DDD52D9277010050565ADF30F244F8CC”. Chúng ta có thể truy tìm lại được mật khẩu và dữ liệu đã bị mã hoá bằng thủ tục sau
use master
go
select getdate() as StartingTime
go
declare @myencryptedtext varbinary(max)
set @myencryptedtext=0×01000000F75D553409C74570F6DDBCADA53FD489DDD52D9277010050565ADF30F244F8CC
print @myencryptedtext
exec hack_encryption @encryptedtext=@myencryptedtext
go
select getdate() as EndingTime
go
Kết quả
StartingTime
———————–
2007-12-18 18:24:10.8430×01000000F75D553409C74570F6DDBCADA53FD489DDD52D9277010050565ADF30F244F8CC
This is the Encrypted text: MAK
The actual data is :123456789EndingTime
———————–
2007-12-18 18:26:36.080
Như bạn thấy trong kết quả (hình 1), nó chỉ cần đển
2 phút để tìm lại được dữ liệu và mật khẩu. Về cơ bản, thủ tục này lặp
lại tất cả khả năng hợp lý có thể xảy ra của các ký tự ASCII có độ dài
trên 6 ký tự để tìm ra mật khẩu và sử dụng nó để giải mã dữ liệu.Tạo ra một thủ tục sẽ không giúp gì nhiều khi dữ liệu đã được mã hoá
nằm trong một bảng. Vì vậy chúng ta phải thay đổi thủ thục này thành
một hàm vô hướng như hướng dẫn dưới đâyBước 1
Tạo thủ tục như sau
USE [master]
GO/****** Object: UserDefinedFunction [dbo].[hack_encryption_password] Script Date: 12/18/2007 18:36:29 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N’[dbo].[hack_encryption_password]‘)
AND type in (N’FN’, N’IF’, N’TF’, N’FS’, N’FT’))
DROP FUNCTION [dbo].[hack_encryption_password]
GO
use [Master]
goCREATE function [dbo].[hack_encryption_password] (@encryptedtext varbinary(max))
returns varchar(6)
with execute as caller
as
begin
declare @password varchar(6)
declare @i int
declare @j int
declare @k int
declare @l int
declare @m int
declare @n intset @i=-1
set @j=-1
set @k=-1
set @l=-1
set @m=-1
set @n=-1
set @password =”while @i<255
begin
while @j<255
begin
while @k<255
begin
while @l<255
begin
while @m<255
begin
while @n<=255
begin
set @password=isnull(char(@i),”) + isnull(char(@j),”)
+isnull(char(@k),”)+ isnull(char(@l),”)
+isnull(char(@m),”) + isnull(char(@n),”)
if convert(varchar(100), DecryptByPassPhrase(ltrim(rtrim(@password)),
@encryptedtext)) is not null
begin
–print ‘This is the Encrypted text:’ +@password
set @i=256;set @j=256;set @k=256;set @l=256;set @m=256;set @n=256;
–print ‘The actual data is :’ +convert(varchar(100),
DecryptByPassPhrase(ltrim(rtrim(@password)),@encryptedtext))
end
–print ‘A’+ltrim(rtrim(@password))+’B’
–print convert(varchar(100),DecryptByPassPhrase(ltrim(rtrim(@password)),@encryptedtext))
set @n=@n+1
end
set @n=0
set @m=@m+1
end
set @m=0
set @l=@l+1
end
set @l=0
set @k=@k+1
end
set @k=0
set @j=@j+1
end
set @j=0
set @i=@i+1
endreturn @password
ENDBước 2
Tạo một bảng với dữ liệu được mã hoá
USE [tempdb]
GO
/****** Object: Table [dbo].[MyTable] Script Date: 12/18/2007 18:44:40 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N’[dbo].[MyTable]‘) AND type in (N’U’))
DROP TABLE [dbo].[MyTable]
GO
create table MyTable(id int, encrypteddata varbinary(max))
go
insert into MyTable select 1, EncryptByPassPhrase(’Do’, ‘1112228333′)
insert into MyTable select 2, EncryptByPassPhrase(’Re’, ‘1212223833′)
insert into MyTable select 3, EncryptByPassPhrase(’Me’, ‘1132223393′)
insert into MyTable select 4, EncryptByPassPhrase(’Fa’, ‘1114223383′)
insert into MyTable select 5, EncryptByPassPhrase(’So’, ‘1112523333′)
insert into MyTable select 6, EncryptByPassPhrase(’La’, ‘1112263373′)
insert into MyTable select 7, EncryptByPassPhrase(’Si’, ‘1112227338′)
goBước 3
Truy vấn dữ liệu sử dụng câu lệnh SQL sau
Select * from MyTable
Bạn sẽ thấy dữ liệu hiển thị như sau (hình 2)
1 0×01000000D8ED1498BEA4023D541C6EA9766A6B7B0585FAE91B942C88C23677550C6FD7FA
2 0×01000000F0725A52501A41D125F049011BE87C5C4A42263E7538B837B8278ADEE5FC2678
3 0×01000000C8804D8516B944B0AE35C71F79130DA415CED5CCF58E522692AC749115EEF0D9
4 0×010000007A91A24638C0E0354336AE5682805312CCB0B1E6BBACB6D9E65DC5D9DA73906E
5 0×010000008FB6BDD91C3D1A8C94FAF647DE1F931CEE5104045BD03DE4E809565E74604DF3
6 0×01000000C3A41428A21EDE8D8579AF9C42132678448A9113A31A869276A7631A58A32BE3
7 0×01000000BD829E12D3EAAF96BB66930301BA1D9CD3748946F354301922A03AE49047FE00
Bước 4
Sử dụng hàm hack_encryption_password để khôi phục tất cả các mật khẩu từ dưc liệu đã được mã hoá trong bảng MyTable. Thực thi câu lệnh SQL sau
select ID ,master.[dbo].[hack_encryption_password] (encrypteddata) as Password from MyTable
Bạn sẽ thấy kết quả như sau (Hình 3)
1 Do
2 Re
3 Me
4 Fa
5 So
6 La
7 Si
Hàm trên có thê được chỉnh sửa để trả về cả dữ liệu đã được mã hoá, thực hiện như sau
Bước 1
Tạo hàm sau
USE [master]
GO/****** Object: UserDefinedFunction [dbo].[hack_encryption_password] Script Date: 12/18/2007 18:36:29 ******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N’[dbo].[hack_encryption_data]‘)
AND type in (N’FN’, N’IF’, N’TF’, N’FS’, N’FT’))
DROP FUNCTION [dbo].[hack_encryption_data]
GO
use [Master]
goCREATE function [dbo].[hack_encryption_data] (@encryptedtext varbinary(max))
returns varchar(8000)
with execute as caller
as
begin
declare @data varchar(8000)
declare @password varchar(6)
declare @i int
declare @j int
declare @k int
declare @l int
declare @m int
declare @n intset @i=-1
set @j=-1
set @k=-1
set @l=-1
set @m=-1
set @n=-1
set @password =”while @i<255
begin
while @j<255
begin
while @k<255
begin
while @l<255
begin
while @m<255
begin
while @n<=255
begin
set @password=isnull(char(@i),”) + isnull(char(@j),”)+isnull(char(@k),”)
+ isnull(char(@l),”)+isnull(char(@m),”) + isnull(char(@n),”)
if convert(varchar(100),DecryptByPassPhrase(ltrim(rtrim(@password)),
@encryptedtext)) is not null
begin
–print ‘This is the Encrypted text:’ +@password
set @i=256;set @j=256;set @k=256;set @l=256;set @m=256;set @n=256;
set @data = convert(varchar(100), DecryptByPassPhrase(ltrim(rtrim(@password)),@encryptedtext))
end
–print ‘A’+ltrim(rtrim(@password))+’B’
–print convert(varchar(100), DecryptByPassPhrase(ltrim(rtrim(@password)),@encryptedtext))
set @n=@n+1
end
set @n=0
set @m=@m+1
end
set @m=0
set @l=@l+1
end
set @l=0
set @k=@k+1
end
set @k=0
set @j=@j+1
end
set @j=0
set @i=@i+1
endreturn @data
END
Bước 2
Giải mã dữ liệu sử dụng hàm đã tạo
select ID ,master.[dbo].[hack_encryption_data] (encrypteddata) as Password from MyTable
Kết quả như hình 4
Lưu ý:
-
Thủ thục và các hàm chỉ có thể hack đối với mật khẩu dài 6 ký tự.
-
Thủ tục và hàm này có thể chiếm rất nhiều CPU để lấy lại dữ liệu và tìm lại mật khẩu






