Introduction
Le but de ce benchmark est de comparer les performances des différentes méthodes de cryptage de données proposées par SQLServer2005.
On en dénombre 4 à ce jour :
. par mot de passe (byphrase)
. par certificat
. par clé symétrique
. par clé asymétrique
Conditions du test
La base utilisée est AdventureWorks, bien connue de tous, la machine étant un
Dual Core 2.20 Ghtz 2 Go de RAM et disque dur de 7200 tours.
Maintenant, l'essentiel est la comparaison relative des différentes méthodes, pas leur valeur absolue.
SQLServer 2005 en en service pack 2.
Préparation des données :
use adventureworks
go
if
exists
(select
*
from
information_schema.tables
where table_name =
'CarteCredit')
drop
table CarteCredit
go
create
table CarteCredit (
IDCarte int
not
null,
TypeCarte nvarchar(50)
not
null,
NoCarte nvarchar(25)
not
null,
MoisExpiration tinyint
not
null,
AnneeExpiration smallint
not
null,
DateMaj datetime
not
null,
NoCarteCrypte varbinary(max),
primary
key
(IDcarte))
go
insert
into dbo.CarteCredit (IDCarte,TypeCarte,NoCarte,MoisExpiration,AnneeExpiration,DateMaj)
select CreditCardID,CardType,CardNumber,ExpMonth,ExpYear,ModifiedDate
from Sales.CreditCard
go
insert
into dbo.CarteCredit (IDCarte,TypeCarte,NoCarte,MoisExpiration,AnneeExpiration,DateMaj)
select CreditCardID + 20000,CardType,CardNumber,ExpMonth,ExpYear,ModifiedDate
from Sales.CreditCard
go
Préparation des clés et certificats :
-- Création de la clé master de la base = celle qui protégera les autres
create
master
key
encryption
by
password
=
'codesecretdemaster'
go
-- On crée une clé asymétrique
create
ASYMMETRIC
key MaCleAsymetrique
WITH ALgoRITHM =
RSA_2048
-- On crée un certificat
create
CERTifICATE MonCertificat
WITH
SUBJECT
=
'Performances de cryptage',
START_DATE
=
'01/01/2007'
,EXPIRY_DATE
=
'01/01/2010'
-- On crée une clé symétrique basée ici sur un certificat
create
SYMMETRIC
key MaCleSymetrique
WITH ALgoRITHM =
DES
ENCRYPTION
BY
CERTifICATE MonCertificat
Le code du benchmark :
set
statistics
io
on
go
set
statistics
time
on
go
--1) Par phrase Encryptage puis décryptage
print
'Phrase'
update dbo.CarteCredit set NoCarteCrypte =
encryptbypassphrase('CodeSecret',NoCarte)
select
count(*)
from dbo.CarteCredit
where NoCarte =
CONVERT(Nvarchar(25),
DECRYPTBYPASSPHRASE('CodeSecret', NoCarteCrypte))
print
'---------'
go
-- 2) Par certificat
print
'Certificat'
update dbo.CarteCredit set NoCarteCrypte =
ENCRYPTBYCERT(CERT_ID('MonCertificat'), NoCarte)
select
count(*)
from dbo.CarteCredit
where NoCarte =
CONVERT(Nvarchar(25),
DECRYPTBYCERT(CERT_ID('MonCertificat'), NoCarteCrypte))
print
'---------'
go
--3) Par clé symétrique
OPEN
SYMMETRIC
key MaCleSymetrique
DECRYPTION
BY
CERTifICATE MonCertificat
print
'Clé symétrique'
update dbo.CarteCredit set NoCarteCrypte =
ENCRYPTBYkey(key_GUID('MaCleSymetrique'), NoCarte)
select
count(*)
from dbo.CarteCredit
where NoCarte =
CONVERT(Nvarchar(25),
DECRYPTBYkey(NoCarteCrypte))
print
'---------'
CLOSE
SYMMETRIC
key MaCleSymetrique
go
--4) Par clé asymétriqe
--create ASYMMETRIC key MaCleAsymetrique
--WITH ALgoRITHM = RSA_2048
print
'Clé asymétrique'
update dbo.CarteCredit set NoCarteCrypte =
ENCRYPTBYASYMkey(ASYMkey_ID('MaCleAsymetrique'), NoCarte)
select
count(*)
from dbo.CarteCredit
where NoCarte =
CONVERT(Nvarchar(25),
DECRYPTBYASYMkey(ASYMkey_ID('MaCleAsymetrique'),
NoCarteCrypte))
print
'---------'
go
Le résultat des mesures :
Les ios sont en pages de SQLServer soit 8kOctets
Le cpu est en milli secondes
Le temps passé est aussi en milli secondes
Conclusion :
Les chiffres parlent d'eux mêmes, et il sera prudent d'évaluer la méthode choisie si on ne veut pas écrouler le serveur SQL par une consommation excessive de CPU.
La méthode par clé asymétrique a quand même consommé une demi-heure de CPU pour 38000 lignes...
A l'inverse,la clé symétrique est infiniment moins gourmande !