streda 1. júna 2011

Symetrické kľúče vs Asymetrické kľúče - čásť 2/2

Pokračovanie z Symetrické kľúče vs Asymetrické kľúče - čásť 1/2

Do tabuliek vložime 5x5 000 riadkov. Dľžka jedného záznamu bude 52 znakov Odmeriame čas potrebný na vloženie dát do tabuliek a porovnáme ich.
DECLARE @StartTime DATETIME, @EndTime DATETIME;
DECLARE @KeyGUID UNIQUEIDENTIFIER, @KeyGUIDCert UNIQUEIDENTIFIER;
DECLARE @AsymKeyID_2048 INT, @AsymKeyID_512 INT;
SET @AsymKeyID_2048 = ASYMKEY_ID ('AsymmKey_RSA2048');
SET @AsymKeyID_512 = ASYMKEY_ID('AsymmKey_RSA512');
SET @KeyGUID = KEY_GUID('SymmKey_AES256');
SET @KeyGUIDCert = KEY_GUID('SymmKey_AES256Cert');

print 'Asymmetric key RSA 2048'
SET @StartTime GETDATE();
INSERT INTO dbo.AsymmKeyTest2048 (SecretColumn)
SELECT TOP 5000 ENCRYPTBYASYMKEY(@AsymKeyID_2048, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')
FROM master.sys.columns c1 CROSS JOIN master.sys.columns c2;

SET @EndTime = GETDATE();
PRINT 'Asymmetric Key 2048: Execution Times (Cas vykonania) (ms): ' + CONVERT(VARCHAR, DATEDIFF(ms, @StartTime, @EndTime));

print 'Asymmetric key RSA 512';

SET @StartTime = GETDATE();
INSERT INTO dbo.AsymmKeyTest512 (SecretColumn)
SELECT TOP 5000 ENCRYPTBYASYMKEY(@AsymKeyID_512,
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')

FROM master.sys.columns c1 CROSS JOIN master.sys.columns c2;
SET @EndTime = GETDATE();

PRINT 'Asymmetric Key 512: Execution Times (Cas vykonania) (ms): ' + CONVERT(VARCHAR, DATEDIFF(ms, @StartTime, @EndTime));

print 'Symmetric key AES 256';
SET @StartTime = GETDATE();
OPEN SYMMETRIC KEY SymmKey_AES256 DECRYPTION BY PASSWORD = 'password4test!';
INSERT INTO dbo.SymmKeyTest (SecretColumn)
SELECT TOP 5000 ENCRYPTBYKEY(@KeyGUID, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')
FROM master.sys.columns c1 CROSS JOIN master.sys.columns c2;

SET @EndTime = GETDATE();
CLOSE SYMMETRIC KEY SymmKey_AES256;

PRINT 'Symmetric Key AES 256: Execution Times (Cas vykonania) (ms): ' + CONVERT(VARCHAR, DATEDIFF(ms, @StartTime, @EndTime));

print 'Symmetric key AES 256 Cert';
SET @StartTime = GETDATE();
OPEN SYMMETRIC KEY SymmKey_AES256Cert DECRYPTION BY Certificate TestDB_Cert WITH PASSWORD ='password4test';
INSERT INTO dbo.SymmKeyTest_Cert (SecretColumn)

SELECT TOP 5000 ENCRYPTBYKEY(@KeyGUIDCert,
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')
FROM master.sys.columns c1 CROSS JOIN master.sys.columns c2;
SET @EndTime = GETDATE();
CLOSE SYMMETRIC KEY SymmKey_AES256Cert;
PRINT 'Symmetric Key AES 256 Cert: Execution Times (Cas vykonania) (ms): ' + CONVERT(VARCHAR, DATEDIFF(ms, @StartTime, @EndTime));

Čas potrebný na vykonanie jednotlivých príkazov.


Výsledok: Najpomalšie vkladanie dát je asymetrickým klúčom s RSA 2048 bitovou šifrou. Symetrický kľúč AES 256 s certifikátom bol rýchlejsí ako symetrický kľúč AES 256. Najrýchlejší sposob bol asymetrický kľúč s RSA 512 bitovou šifrou. Časove rozdiely medzi jednotlivými typmi sú síce rozdielne, ale keďže málokedy vkladáme taký obnos dát do databázy, viac nás bude zaujímať následujúci test.


Teraz otestujeme čas potrebný na dešifrovanie údajov: Postupne sme dešifrovali stále väčší počet riadkov - Top 100, Top 500, Top 1000, Top 5000 a Top 25 000.
USE TestDB;
DECLARE @StartTime DATETIME, @EndTime DATETIME;
DECLARE @KeyGUID UNIQUEIDENTIFIER, @KeyGUIDCert UNIQUEIDENTIFIER;
DECLARE @AsymKeyID_2048 INT, @AsymKeyID_512 INT;
SET @AsymKeyID_2048 = ASYMKEY_ID ('AsymmKey_RSA2048');
SET @AsymKeyID_512 = ASYMKEY_ID('AsymmKey_RSA512');
SET @KeyGUID = KEY_GUID('SymmKey_AES256');
SET @KeyGUIDCert = KEY_GUID('SymmKey_AES256Cert');

print 'Select with Asymmetric key RSA 2048';
SET @StartTime = GETDATE();
SELECT TOP 25000 CONVERT(varchar(255), DECRYPTBYASYMKEY(@AsymKeyID_2048, SecretColumn, N'password4test!'))
FROM dbo.AsymmKeyTest2048;
SET @EndTime = GETDATE();
PRINT 'Asymmetric Key AES RSA 2048: Execution Times (Cas vykonania) (ms): ' + CONVERT(VARCHAR, DATEDIFF(ms, @StartTime, @EndTime));

print 'Select with Asymmetric key RSA 512';
SET @StartTime = GETDATE();
SELECT TOP 25000 CONVERT(varchar(255), DECRYPTBYASYMKEY(@AsymKeyID_512, SecretColumn, N'password4test!'))
FROM dbo.AsymmKeyTest512;
SET @EndTime = GETDATE();
PRINT 'Asymmetric Key AES RSA 512: Execution Times (Cas vykonania) (ms): ' + CONVERT(VARCHAR, DATEDIFF(ms, @StartTime, @EndTime));

print 'Select with Symmetric key AES 256';
OPEN SYMMETRIC KEY SymmKey_AES256 DECRYPTION BY PASSWORD = 'password4test!';
SET @StartTime = GETDATE(); SELECT TOP 25000 CONVERT(varchar(255), DECRYPTBYKEY(SecretColumn))
FROM dbo.SymmKeyTest;
SET @EndTime = GETDATE();
CLOSE SYMMETRIC KEY SymmKey_AES256;
PRINT 'Symmetric Key AES AES 256: Execution Times (Cas vykonania) (ms): ' + CONVERT(VARCHAR, DATEDIFF(ms, @StartTime, @EndTime));

print 'Select with Symmetric key AES 256 Cert';
OPEN SYMMETRIC KEY SymmKey_AES256Cert DECRYPTION BY Certificate TestDB_Cert WITH PASSWORD = 'password4test';
SET @StartTime = GETDATE();
SELECT TOP 25000 CONVERT(varchar(255), DECRYPTBYKEY(SecretColumn))
FROM dbo.SymmKeyTest_Cert;
SET @EndTime = GETDATE();
CLOSE SYMMETRIC KEY SymmKey_AES256Cert;
PRINT 'Symmetric Key AES AES 256 Cert: Execution Times (Cas vykonania) (ms): ' + CONVERT(VARCHAR, DATEDIFF(ms, @StartTime, @EndTime));

Čas potrebný na vykonanie jednotlivých príkazov...


Výsledok: Už na prvý pohľad je jasné, že použitie asymetrického kľúča s 2048 bitovou šifrou na šifrovanie citlivých dát je nepoužiteľné. Čas potrebný na dešifrovanie touto šifrou narastal skoro lineárne s počtom riadkov ktoré bolo nutné dešifrovať. O niečo lepšie si počínal asymetrický kľúč s 512 bitovou šifrou, ovšem aj tieto časy sú neprimerane veľké a hlavne obmedzenie na 53 znakov je dosť limitujúce. Dešifrovanie symetrickými kľúčmi bolo pomerne rovnaké, avšak oproti asymetrickým kľúčom niekoľko krát rýchlejšie. Pri dešifrovaní 5000 reťazcov sú rozdiely medzi symetrickým a asymetrickým šifrovaní neporovnateľné, 66 120 milisekúnd vs 123 milisekúnd (RSA 2048 vs AES 256) alebo 2 973 ms vs 80 ms (RSA 512 vs AES256 s cert)


Zhrnutie:  Boj medzi symetrickým a asymetrickým kľúčom z hľadiska použiteľnosti a výkonu je jednoznačne v prospech symetrického kľúča. Ďalším pozitívným faktorom je neobmedzenosť dĺžky reťazca, ktorý sa šifruje. Pri asymetrických kľúčoch je táto dĺžka obmedzená. 

štvrtok 26. mája 2011

Symetrické kľúče vs Asymetrické kľúče - časť 1/2

Veľmi často potrebujeme šifrovať naše data v databáze v rámci SQL serveru. Aby sme sa chránili pred únikom citlivých dát (heslá, firemné údaje a pod) používame šifrovacie nástroje. Teraz sa pozrieme na dva základne typy šifrovania priamo pod SQL serverom.
  • šifrovanie pomocou symetrického kľúča
  • šifrovanie pomocou asymetrického kľúča
Ukážeme si ako sa jednotlivé kľúče vytvárajú, ako sa používajú pri šifrovaní dát a následne ako tieto data načítať. Dozvieme sa aký je zásadný rozdiel medzi symetrickým a asymetrickým kľúčom a prečo je symetrický kľúč uprednostňovaný pred asymetrickým. Rozdiely medzi jednotlivými kľúčmi si ukážeme na praktickej ukážke, kde sa hlavne zameriame na výkonnosť jednotlivých šifrovacích kľúčov.
Symetrický kľúč: Symetrický kľúč musí byť šifrovaný jedným z následujúcich spôsobov - certifikát, heslo, iný symetrický kľúč, aymetrický kľúč alebo provider. Šifrovací algoritmus musí byť jedna z týchto možností:
  • DES
  • TRIPLE_DES
  • TRIPLE_DES_3KEY 
  • RC2 
  • RC4 
  • RC4_128
  • DESX 
  • AES_128 
  • AES_192 
  • AES_256
Algoritmus DESX aktuálne používa TRIPLE DES s 192 bitovým kľúčom. V ďaľších verziách SQL Serveru už nebude podporovaný. Algoritmus TRIPLE_DES používa TRIPLE DES s 128-bitovým kľúčom.
Asymetrický kľúč: Asymetrický kľúč je tvorený dvojicou súkromného a verejného kľúča. Typy šifrovania:
  • RSA 512 ( max 53 znakov pre typ varchar, 21 znakov pre nvarchar )
  • RSA 1024  ( max 117 znakov pre typ varchar, 53 znakov pre nvarchar )
  • RSA 2048  ( max 245 znakov pre typ varchar, 117 znakov pre nvarchar )
Limit znakov sa počíta ako dĺžka šifry / 8 (16 pre nvarchar) - 11 (Microsoft Enhanced Cryptographic Provider for PKCS #1 padding)´= maximálny počet znakov

Najprv si vytvoríme certifikát.
USE TestDB
CREATE CERTIFICATE TestDB_Cert
ENCRYPTION BY PASSWORD 'password4test'
WITH SUBJECT = 'Certificate for secret data'
EXPIRY_DATE = '10/31/2015';
GO
Zoznam všetkých možných certifikátov získame následujúcim príkazom:
USE TestDB;
SELECT * FROM sys.certificates;
Zoznam všetkých symetrických a asymetrických kľúčov získame pomocou sql príkazu:
USE TestDB;
SELECT * FROM sys.symmetric_keys;
SELECT * FROM sys.asymmetric_keys;
Keďže sme zatiaľ žiaden kľúč nevytvorili využíjeme tieto príkazy neskôr. Vytvoríme 4 kľuče, 2 asymetrické a 2 symetrické a 1 certifikát
  • Asymetrický kľuč s kódovaním RSA_2048 šifrovaný heslom
  • Asymetrický kľuč s kódovaním RSA_512 šifrovaný heslom
  • Symetrický kľúč s kódovanim AES_256 šifrovaný heslom
  • Symetrický kľúč s kódovanim AES_256 šifrovaný certifikátom
USE TestDB;
print 'Asymetric key RSA 2048';
CREATE ASYMMETRIC KEY AsymmKey_RSA2048
WITH ALGORITHM = RSA_2048
ENCRYPTION BY PASSWORD ='password4test!';
GO
print 'Asymetric key RSA 512'
CREATE ASYMMETRIC KEY AsymmKey_RSA512
WITH ALGORITHM RSA_512
ENCRYPTION BY PASSWORD = 'password4test!'
GO
print 'Symetric key AES 256'
CREATE SYMMETRIC KEY SymmKey_AES256
WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = ''password4test!'
GO
print 'Symetric key AES 256 Cert'
CREATE SYMMETRIC KEY SymmKey_AES256Cert
WITH ALGORITHM = AES_256
 ENCRYPTION BY CERTIFICATE TestDB_Cert
GO
Pozrime sa teraz na zoznam certifikátov a kľúčov.
USE TestDB;
SELECT * FROM sys.certificates;
SELECT * FROM sys.symmetric_keys;
SELECT * FROM sys.asymmetric_keys;
Mali by sme vidieť jeden certifikát, dva symetrické a dva asymetrické kľuče. Viď obrázok č.1
Obrázok č.1 - Prehľad vytvorených kľúčov a certifikát
Vytvoríme si testovacie tabuľky na ktorých budeme testovať výkonnosť.
CREATE TABLE dbo.SymmKeyTest(
SecretColumn VARBINARY(256))
GO
CREATE TABLE dbo.SymmKeyTest_Cert(
SecretColumn VARBINARY(256))
GO
CREATE TABLE dbo.AsymmKeyTest512 (
SecretColumn VARBINARY(256))
GO
CREATE TABLE dbo.AsymmKeyTest2048(
SecretColumn VARBINARY(256))
GO
Pokračovanie:  Symetrické kľúče vs Asymetrické kľúče - čásť 2/2

pondelok 23. mája 2011

Zmazanie log súboru / Truncate log file

Transakčné logy  pri databázach dosahujú v niekotrých pripadoch niekoľko násobok veľkosti dátovej časti.
Ako zmenšiť veľkosť transakčného LOG súboru ?
1.     Najprv je potrebné zálohovať pôvodný log súbor.  (prípadne celú databázu) 

BACKUP LOG [TestDb] TO DISK = N'C:\Backup\TestDb.bak'
GO
2.   Následne stačí následujúci krátky script a transakčný Log bude mat veľkosť 1MB
USE [master]
GO
ALTER DATABASE [TestDb] SET RECOVERY SIMPLE WITH NO_WAIT
DBCC SHRINKFILE(TestDbLog, 1)
ALTER DATABASE [TestDb] SET RECOVERY FULL WITH NO_WAIT
GO

Čo presne spravi tento script ? Jednoducho zmení recovery model na jednoduchý (Simple recovery), následne sa transakčný log zmenší na veľkosť udanú v MB, v našom prípade na 1MB. Posledným príkazom jednoducho zmeníme recovery na plné obnovenie (Full Recovery).