Jakiś czas temu konsultowałem rozwiązanie, w którym pojawiła się potrzeba przechowywania wybranych danych zaszyfrowanych hasłem podanym przez użytkownika. O ile oczywiście można to zrealizować w kodzie po stronie aplikacji, o tyle chciałbym zaprezentować, jak w łatwy sposób można zrobić to po stronie bazy danych.
SQL Server oferuje dwie funkcje umożliwiające odpowiednio operację szyfrowania i deszyfrowania: ENCRYPTBYPASSPHASE oraz DECRYPTBYPASSPHRASE.
Podstawowe szyfrowanie wygląda następująco:
DECLARE @encrypted VARBINARY(8000); DECLARE @clearText NVARCHAR(128) = 'Wiadomosc do zaszyfrowania'; DECLARE @passphrase NVARCHAR(128) = '$ecret'; SELECT @encrypted = ENCRYPTBYPASSPHRASE(@passphrase, @clearText); SELECT @encrypted;
Deszyfrowanie natomiast wykonujemy tak:
SELECT CONVERT(NVARCHAR(128), DECRYPTBYPASSPHRASE(@passphrase, @encrypted))
Dane szyfrowane są przy użyciu algorytmu Triple DES z 128 bitowym kluczem tworzonym na bazie @passphrase.
Bezpieczeństwo zaszyfrowanych danych możemy jeszcze bardziej wzmocnić dodając do klucza popularną „sól” – czyli w terminologii SQL Servera – authenticator:
DECLARE @encrypted VARBINARY(8000); DECLARE @clearText NVARCHAR(128) = 'Wiadomosc do zaszyfrowania'; DECLARE @passphrase NVARCHAR(128) = '$ecret'; DECLARE @authenticator NVARCHAR(128) = '$alt'; SELECT @encrypted = ENCRYPTBYPASSPHRASE(@passphrase, @clearText, 1, @authenticator); SELECT @encrypted;
Deszyfrowanie z authenticatorem realizujemy analogicznie:
SELECT CONVERT(NVARCHAR(128), DECRYPTBYPASSPHRASE(@passphrase, @encrypted, 1, @authenticator))
Oczywiście aby dodanie authenticatora miało sens należy dla każdego szyfrowanego wiersza zastosować inny, najlepiej unikatowy authenticator.
Więcej informacji na temat szyfrowania przy pomocy powyższych funkcji znajdziecie na MSDNie.
Dodaj komentarz