itrain-home Kinderpatenschaften mit Plan Deutschland  
home
 Aktuelle Seite:  knowhow sql 2005 tsql encryption encrypt.asp 
 



 

Verschlüsselung von Daten

Mit dem SQL Server 2005 ist es nun auch möglich Daten direkt auf dem Server zu verschlüsseln. Für das Verschlüsseln und Entschlüsseln der Daten können asymmetrische oder symmetrische Verschlüsselungsverfahren verwendet werden.

Symmetrische Verschlüsselung

Bei der symmetrischen Verschlüsselung wird der gleiche Schlüssel sowohl für die Verschlüsselung als auch für die Entschlüsselung der Informationen verwendet. Symmetrische Verschlüsselungsverfahren sind performanter als asymmetrische Verfahren; daher empfiehlt sich für die Verschlüsselung von Daten in der Datenbank die Verwendung von symmetrischen Schlüsseln.

Asymmetrische Verschlüsselung

Der Nachteil der symmetrischen Verschlüsselung liegt darin, dass für beide Vorgänge, also das Verschlüsseln und das Entschlüsseln der gleiche Schlüssel bekannt sein muss. Bei Einsatzgebieten, bei denen Verschlüsselung und Entschlüsselung bei verschiedenen Partnern stattfinden (also zum Beispiel beim Versenden verschlüsselter Emails) besteht so das Problem, wie der geheime Schlüssel zwischen Sender und Empfänger sicher ausgetauscht werden kann. Diese Problematik lässt sich durch die Verwendung von asymmetrischen Verschlüsselungsverfahren überwinden. Bei der asymmetrischen Verschlüsselung werden zwei unterschiedliche Schlüssel für das Verschlüsseln und Entschlüsseln verwendet. In der Regel wird der Schlüssel zum Verschlüsseln öffentlich zugänglich gemacht („Public Key“). Der zugehörige Schlüssel zum Entschlüsseln der Nachricht verbleibt beim Empfänger („Private Key“). Dadurch ist ein sicherer Austausch von Informationen zwischen Sender und Empfänger möglich, ohne dass das Geheimnis (der Schlüssel) preisgegeben werden muss. Eine andere Variante der asymmetrischen Verschlüsselung wird beim Signieren von Modulen verwendet. Hier wird ein Hash aus dem Modul mit Hilfe des privaten Schlüssels verschlüsselt gespeichert. Beim Ausführen der Prozedur kann der Hash mit Hilfe des öffentlichen Schlüssels wieder entschlüsselt und geprüft werden. Da der private Schlüssel unbekannt ist, ist es nicht möglich, den Hash des Moduls nach einer Änderung erneut zu generieren.
Da bei der jetzigen Implementierung der Verschlüsselung im SQL Server Ver- und Entschlüsselung grundsätzlich auf dem Server stattfinden und damit auch bei asymmetrischer Verschlüsselung beide Schlüssel an der gleichen Stelle gespeichert werden, bietet die asymmetrische Verschlüsselung von Daten keine Vorteile. In der Regel wird die asymmetrische Verschlüsselung nur zum Sichern der symmetrischen Schlüssel verwendet. Eine Ausnahme bildet der Einsatz von Zertifikaten für das Signieren von Modulen.

Der Schlüssel ist der Schlüssel

Grundsätzlich ist die Verschlüsselung von Daten nur so sicher wie der Schlüssel selbst. Das bedeutet, dass jeder der Zugriff auf den Schlüssel hat auch in der Lage ist, die Daten wieder zu entschlüsseln. Der Zugriff auf die Schlüssel wird im SQL Server auf zwei Arten geschützt: Zum einen kann – wie bei allen anderen Datenbankobjekten auch – der Zugriff über Berechtigungen eingeschränkt werden. Dadurch erhalten nur autorisierte Benutzer Zugriff auf die Schlüssel; Datenbankbesitzer oder Systemadministratoren erhalten so aber in jedem Fall Zugriff auf alle Schlüssel der Datenbank. Daher wird der Schlüssel zusätzlich geschützt, indem der Schlüssel selbst wieder verschlüsselt gespeichert wird. Für die verschlüsselte Speicherung eines Schlüssels können andere Schlüssel oder ein Kennwort verwendet werden.

Der Schlüssel unter der Fußmatte

Um Daten zu verschlüsseln oder entschlüsseln muss grundsätzlich zunächst der Schlüssel geöffnet werden. Anschließend kann die Funktion zum Verschlüsseln (z.B. EncryptByKey) oder Entschlüsseln (z.B. DecryptByKey) aufgerufen werden. Um den Vorgang des Öffnens von Schlüsseln zu automatisieren, können die Schlüssel quasi automatisch geöffnet werden. Um das möglich zu machen, verwendet der SQL Server eine Verschlüsselungshierarchie, bei der ein Schlüssel automatisch mit dem übergeordneten Schlüssel geöffnet werden kann.

Datenbank- und Diensthauptschlüssel

Um die Schlüssel in einer Datenbank automatisch öffnen zu können, kann der sogenannte Datenbankhauptschlüssel verwendet werden. Wird ein Schlüssel mit dem Datenbankhauptschlüssel verschlüsselt abgespeichert, so kann er automatisch geöffnet werden, sobald der Datenbankhauptschlüssel geöffnet ist. Dadurch reicht es aus, einen Schlüssel zu öffnen, um Zugriff auf alle mit diesem Schlüssel verschlüsselten Schlüssel in der Datenbank zu erhalten (Voraussetzung dazu ist natürlich zusätzlich die Berechtigung auf die Schlüsselobjekte).
Um auch das Öffnen des Datenbankhauptschlüssels zu automatisieren, kann der Datenbankhauptschlüssel wiederum mit dem sogenannten Diensthauptschlüssel verschlüsselt abgespeichert werden. In diesem Fall muss auch der Datenbankhauptschlüssel nicht mehr explizit geöffnet werden. Der Diensthauptschlüssel wird automatisch mit Hilfe der DPAPI während der Serverinstallation erzeugt.
Diese Automatisierung bedeutet natürlich auch, dass die Daten jetzt eigentlich nur noch durch Berechtigungen geschützt sind, da keine Kennwörter benötigt werden, um einen Schlüssel in der Datenbank zu öffnen. Trotzdem hat natürlich auch dieses Vorgehen seine Berechtigung, denn die Daten können verschlüsselt abgespeichert werden, ohne dass die Anwendung explizit Anweisungen zum Öffnen und Schließen von Schlüsseln benötigt. Werden die Ver- und Entschlüsselungsmethoden in Sichten oder gespeicherten Prozeduren verwendet, so ist die Datenverschlüsselung für die Anwendung transparent. Dieses Vorgehen bietet auch hinreichenden Schutz für die Datenbanksicherungen, da eine Wiederherstellung der Daten auf einem anderen Server keinen Zugriff auf die Daten ermöglicht, denn in der Sicherung selbst ist der Diensthauptschlüssel natürlich nicht enthalten.

Daten ver- und entschlüsseln – Schritt für Schritt

Da es eine große Zahl an Verschlüsselungsmöglichkeiten gibt, hier einige Beispiele, die einige der möglichen Vorgehensweisen demonstrieren sollen.
Im ersten Beispiel werden Daten mit Hilfe eines symmetrischen Schlüssels verschlüsselt. Der symmetrische Schlüssel wird durch ein Kennwort geschützt. Zur Verschlüsselung wird der Triple-DES Algorithmus verwendet.
Als Beispieldaten sollen Bankleitzahl und Kontonummer verschlüsselt in einer Tabelle abgelegt werden:
-- Anlegen der Tabelle kontoinformationen
IF OBJECT_ID('dbo.kontoinformationen', 'U') IS NOT NULL
    DROP TABLE dbo.kontoinformationen
CREATE TABLE dbo.kontoinformationen (BLZ varbinary(52), Kontonr varbinary(52))
GO
Listing: Anlegen einer Beispieltabelle zum Speichern verschlüsselter Kontoinformationen
Um die Daten verschlüsselt abspeichern zu können, wird ein symmetrischer Schlüssel erstellt:
-- Erstellen eines symmetrischen Schlüssels
--(durch Kennwort gesichert)
CREATE SYMMETRIC KEY KontoSchluessel
    WITH ALGORITHM=TRIPLE_DES
    ENCRYPTION BY PASSWORD = '!AmE3Zqp@NeP4$'
GO
-- Abrufen von Informationen zum erstellten Schlüssel:
SELECT * FROM sys.symmetric_keys

Listing: Erstellen eines symmetrischen Schlüssels
Informationen zum erstellten
                Schlüssel aus der Sicht „sys.symmetric_keys“
Abbildung>: Informationen zum erstellten Schlüssel aus der Sicht „sys.symmetric_keys“
Nachdem der Schlüssel erstellt ist, können Daten mit diesem Schlüssel verschlüsselt werden. Dazu muss der Schlüssel zunächst geöffnet werden, anschließend kann der Schlüssel in der Funktion EncryptByKey für die Verschlüsselung verwendet werden; nach dem Verwenden des Schlüssels sollte dieser wieder geschlossen werden:
-- Einfügen von Datensätzen mit Verschlüsselung
-- Öffnen des Schlüssels
OPEN SYMMETRIC KEY KontoSchluessel
    DECRYPTION BY PASSWORD = '!AmE3Zqp@NeP4$'
-- Zur Info: Prüfen, ob der Schlüssel geöffnet ist:
SELECT * FROM sys.openkeys
-- Einfügen von Datensätzen
INSERT INTO dbo.kontoinformationen (BLZ, Kontonr)
    VALUES (EncryptByKey(KEY_GUID('Kontoschluessel'), '70080000'),
            EncryptByKey(KEY_GUID('Kontoschluessel'), '0123456789'))
INSERT INTO dbo.kontoinformationen (BLZ, Kontonr)
    VALUES (EncryptByKey(KEY_GUID('Kontoschluessel'), '70080000' ),
             EncryptByKey(KEY_GUID('Kontoschluessel'), '987654321' ))
-- Schließen des Symmetrischen Schlüssels
CLOSE SYMMETRIC KEY Kontoschluessel

Listing: Verschlüsseln von Datensätzen mit der Funktion „EncryptByKey“
Werden nun Daten aus der Tabelle abgerufen, so werden nur die verschlüsselten Werte angezeigt. Beim Einsatz der DES- und AES-Verschlüsselungsverfahren wird außerdem automatisch ein „Salt“-Wert verwendet, dadurch ist sichergestellt, das anhand der verschlüsselten Daten nicht erkannt werden kann, ob zwei Werte den gleichen Inhalt besitzen.
-- Abrufen von Daten ohne Entschlüsselung
SELECT * FROM dbo.kontoinformationen

Listing: Abrufen von Daten ohne Entschlüsselung
Um die verschlüsselten Daten wieder lesen zu können, muss der Schlüssel erneut geöffnet werden. Anschließend können die Daten mit Hilfe der Funktion DecryptByKey wieder entschlüsselt werden.
-- Lesen der Daten mit Entschlüsselung
-- Schlüssel öffnen
OPEN SYMMETRIC KEY Kontoschluessel
    DECRYPTION BY PASSWORD = '!AmE3Zqp@NeP4$'
SELECT CAST(DecryptByKey(BLZ) AS varchar(8)) AS BLZ,
       CAST(DecryptByKey(Kontonr) AS varchar(10)) AS Kontonr
       FROM dbo.kontoinformationen
CLOSE SYMMETRIC KEY Kontoschluessel

Listing: Lesen von Daten mit Entschlüsselung (DecryptByKey)
Symmetrische Schlüssel können nicht nur durch Kennwörter, sondern auch durch asymmetrische Schlüssel oder Zertifikate geschützt werden. Das folgende Beispiel zeigt, wie ein symmetrischer Schlüssel mit Hilfe eines Zertifikats geschützt werden kann:
-- Erstellen eines symmetrischen Schlüssels
-- mit Schutz durch ein Zertifikat
CREATE CERTIFICATE KontoZertifikat
    ENCRYPTION BY PASSWORD = '#Et4Wrzucp*'
    WITH SUBJECT = 'Zugriff auf Kontoschluessel2',
    START_DATE = '20060101',
    EXPIRY_DATE = '20080101'
-- Erstellen eines symmetrischen Schlüssel,
-- der durch das Zertifikat verschlüsselt wird
CREATE SYMMETRIC KEY Kontoschluessel2
    WITH ALGORITHM = TRIPLE_DES ENCRYPTION
    BY CERTIFICATE Kontozertifikat

Listing: Erstellen eines Zertifikats zum Verschlüsseln eines symmetrischen Schlüssels
Im Gegensatz zum vorangegangenen Beispiel wird in diesem Fall der Schlüssel mit Hilfe des Zertifikats geöffnet. Da der private Schlüssel des Zertifikats nicht durch den Datenbankhauptschlüssel, sondern durch ein Kennwort geschützt ist, muss dieses Kennwort beim Öffnen des Zertifikats mit angegeben werden:
-- Einfügen von Datensätzen, die mit dem Schlüssel Kontoschluessel2
-- verschlüsselt werden
OPEN SYMMETRIC KEY Kontoschluessel2
    DECRYPTION BY CERTIFICATE Kontozertifikat
    WITH PASSWORD = '#Et4Wrzucp*'
-- Einfügen von Datensätzen, die mit Kontoschluessel2
-- verschlüsselt werden
INSERT INTO dbo.kontoinformationen (BLZ, Kontonr)
VALUES (EncryptByKey(KEY_GUID('Kontoschluessel2'), '70040000'),
        EncryptByKey(KEY_GUID('Kontoschluessel2'), '1122334455')
INSERT INTO dbo.kontoinformationen (BLZ, Kontonr)
    VALUES (EncryptByKey(KEY_GUID('Kontoschluessel2'), '20020020'),
            EncryptByKey(KEY_GUID('Kontoschluessel2'), '66778899'))
-- Schließen des symmetrischen Schlüssels nach der Verwendung
CLOSE SYMMETRIC KEY Kontoschluessel2

Listing: Verschlüsseln von Daten mit einem Zertifikat-geschütztem symmetrischen Schlüssel
Um die Syntax für den Zugriff auf die Daten zu vereinfachen, können die Entschlüsselungsfunktionen natürlich auch in einer Sicht verwendet werden.
-- Erstellen einer Sicht für das Entschlüsseln der Daten
IF OBJECT_ID('dbo.kontoinfosView', 'V') IS NOT NULL
    DROP VIEW dbo.kontoinfosView
GO
CREATE VIEW dbo.kontoinfosView
AS
SELECT CAST(DecryptByKey(BLZ) AS varchar(8)) AS BLZ,
       CAST(DecryptByKey(Kontonr) AS varchar(10)) AS Kontonr
       FROM dbo.kontoinformationen
GO
Listing: Erstellen einer Sicht zum Entschlüsseln der Daten
Werden nun Daten über diese Sicht abgerufen, ohne die für die Verschlüsselung verwendeten Schlüssel zu öffnen, werden lediglich NULL-Werte angezeigt.
-- Abrufen von Daten ohne Schlüssel
SELECT * FROM dbo.kontoinfosView

Listing: Abrufen von Daten ohne geöffneten Schlüssel
Ohne passenden Schlüssel
                werden nur NULL-Werte zurückgegeben
Abbildung: Ohne passenden Schlüssel werden nur NULL-Werte zurückgegeben
Wird ein Schlüssel geöffnet, so können alle mit diesem Schlüssel verschlüsselten Daten wieder gelesen werden.
-- Öffnen des Schlüssels Kontoschluessel2
OPEN SYMMETRIC KEY Kontoschluessel2
    DECRYPTION BY CERTIFICATE Kontozertifikat
    WITH PASSWORD = '#Et4Wrzucp*'
-- Abrufen von Daten
SELECT * FROM dbo.kontoinfosView

Da nur Kontoschluessel2
                geöffnet ist, können nur die mit diesem Schlüssel verschlüsselten Daten wieder ermittelt
                werden.
Abbildung: Da nur Kontoschluessel2 geöffnet ist, können nur die mit diesem Schlüssel verschlüsselten Daten wieder ermittelt werden.
Natürlich können weitere Schlüssel – soweit benötigt – geöffnet werden, um wieder Zugriff auf alle Daten zu erhalten.
-- Zusätzliches Öffnen des zweiten Schlüssels
OPEN SYMMETRIC KEY KontoSchluessel
     DECRYPTION BY PASSWORD = '!AmE3Zqp@NeP4$'
-- Abrufen von Daten
SELECT * FROM dbo.kontoinfosView

Listing: Öffnen eines weiteren symmetrischen Schlüssel mit Angabe eines Kennworts
Nur wenn alle für die
                Verschlüsselung verwendeten Schlüssel geöffnet sind, können alle Daten auch wieder
                entschlüsselt werden
Abbildung: Nur wenn alle für die Verschlüsselung verwendeten Schlüssel geöffnet sind, können alle Daten auch wieder entschlüsselt werden
Nach der Verwendung der Schlüssel sollten alle Schlüssel wieder geschlossen werden:
-- Schließen aller geöffneten Schlüssel
CLOSE ALL SYMMETRIC KEYS

Listing: Schließen aller offenen symmetrischen Schlüssel
Beim Entschlüsseln der Daten wird automatisch der richtige Schlüssel verwendet. Dies ist möglich, da in den ersten 16-Bytes der verschlüsselten Daten hinterlegt ist, mit welchem Schlüssel die Daten verschlüsselt wurden. Die folgende Abfrage zeigt für jede verschlüsselte Bankleitzahl den Namen des verwendeten Schlüssels an:
SELECT name, BLZ
    FROM sys.symmetric_keys
    INNER JOIN dbo.kontoinformationen
    ON CAST(BLZ AS varbinary(16)) = CAST(key_guid AS varbinary(16))

Ermitteln des verwendeten
                Schlüssels für jeden einzelnen Datensatz
Abbildung: Ermitteln des verwendeten Schlüssels für jeden einzelnen Datensatz

Die Hauptschlüssel

Bei allen bisherigen Beispielen mussten die Schlüssel explizit durch Angabe eines Kennworts geöffnet werden. Mit Hilfe des Datenbankhauptschlüssels können asymmetrische Schlüssel und Zertifikate ohne Angabe eines Kennworts geöffnet werden. Um diese Möglichkeit nutzen zu können, muss in der Datenbank zunächst ein Datenbankhauptschlüssel angelegt werden. Dieser Schlüssel wird zum einen mit dem angegebenen Kennwort verschlüsselt gespeichert; zusätzlich wird automatisch eine durch den Diensthauptschlüssel der Instanz verschlüsselte Kopie gespeichert.
Nachdem der Datenbankhauptschlüssel erstellt ist, kann der Kennwortschutz vom Zertifikat entfernt werden. Das Zertifikat ist anschließend durch den Datenbankhauptschlüssel geschützt.
-- Erstellen des Datenbankhauptschlüssels
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '§Bzm7/Uc.W'
-- Schützen des Zertifikats durch den Datenbankhauptschluessel
ALTER CERTIFICATE KontoZertifikat
       WITH PRIVATE KEY (DECRYPTION BY PASSWORD = '#Et4Wrzucp*')

Listing: Erstellen eines Datenbankhauptschlüssels und Verschlüsseln eines bestehenden Zertifikats mit dem Datenbankhauptschlüssel
Schutz von asymmetrischen Schlüsseln
Während symmetrische Schlüssel mehrfach verschlüsselt gespeichert werden können (d.h. es sind mehrere Kopien des Schlüssel vorhanden), wird bei asymmetrischen Schlüsseln (also auch bei Zertifikaten) jeweils der private Schlüssel durch eine einzige Verschlüsselungsart gesichert. Da es nicht möglich ist, einen privaten Schlüssel unverschlüsselt zu Speichern, muss beim Entfernen der Verschlüsselung eine neue Verschlüsselungsart angegeben werden. Ist ein Datenbankhauptschlüssel vorhanden, so wird dieser für die Verschlüsselung verwendet, falls keine Verschlüsselung angegeben wird.
Wie der private Schlüssel verschlüsselt wurde, kann über die Sichten sys.asymmetric_keys bzw. sys.certificates in der Spalte „pvt_key_encryption_type“ ermittelt werden.
Da eine Version der Datenbankhauptschlüssels durch den Diensthauptschlüssel entschlüsselt werden kann, kann das Zertifikat jetzt ohne Angabe eines Kennworts geöffnet werden. Dadurch ist auch für das Öffnen des symmetrischen Schlüssels „Kontoschluessel2“ kein Kennwort mehr erforderlich:
-- Öffnen des symmetrischen Schlüssels Kontoschluessel2
OPEN SYMMETRIC KEY Kontoschluessel2
       DECRYPTION BY CERTIFICATE KontoZertifikat
-- Abrufen von Daten
SELECT * FROM dbo.kontoinfosView
-- Schließen des symmetrischen Schlüssels nach der Verwendung
CLOSE SYMMETRIC KEY Kontoschluessel2

Listing: Öffnen eines symmetrischen Schlüssels ohne Kennwortangabe
Wie die symmetrischen Schlüssel in der Datenbank jeweils geschützt sind kann natürlich auch über die Systemsichten ermittelt werden. Im bisherigen Beispiel wurde der symmetrische Datenbankhauptschlüssel zum einen per Kennwortschutz abgelegt, zum anderen auch durch eine Verschlüsselung mit dem Diensthauptschlüssel. Der symmetrische Schlüssel „Kontoschluessel2“ wird durch das Zertifikat „Kontozertifikat“ geschützt und der Schlüssel „Kontoschluessel“ ist durch ein Kennwort geschützt.
-- Wodurch sind die symmetrischen Schlüssel geschützt?
SELECT name, algorithm_desc, key_length, crypt_type_desc
       FROM sys.key_encryptions ken
       INNER JOIN sys.symmetric_keys syk
       ON syk.symmetric_key_id = ken.key_id

Listing: Ermitteln der Verschlüsselung von symmetrischen Schlüsseln
Übersicht der Verschlüsselungstypen
                für alle symmetrischen Schlüssel in der Datenbank
Abbildung: Übersicht der Verschlüsselungstypen für alle symmetrischen Schlüssel in der Datenbank
Soll die Möglichkeit den Datenbankhauptschlüssel mit Hilfe des Diensthauptschlüssels zu entschlüsseln unterbunden werden, so kann diese Verschlüsselung entfernt werden; in diesem Fall muss der Datenbankhauptschlüssel vor jeder weiteren Verwendung explizit mit Angabe des Kennworts geöffnet werden:
-- Entfernen der Diensthauptschlüssel-Verschlüsselung vom -- DatenbankhauptschlüsselALTER MASTER KEY DROP ENCRYPTION BY SERVICE MASTER KEY -- Der Datenbankhauptschlüssel muss jetzt explizit geöffnet werdenOPEN MASTER KEY DECRYPTION BY PASSWORD = '§Bzm7/Uc.W'
-- Anschließend kann das Zertifikat ohne Kennwort geöffnet werden
OPEN SYMMETRIC KEY Kontoschluessel2
      DECRYPTION BY CERTIFICATE KontoZertifikat
-- Prüfen, welche Schlüssel geöffnet sind
SELECT * FROM sys.openkeys
-- Abrufen von Daten
SELECT * FROM dbo.kontoinfosView
-- Schließen von Kontoschluessel2 und Datenbankhauptschlüssel
CLOSE ALL SYMMETRIC KEYS

Listing: Verwenden eines Datenbankhauptschlüssels, der nicht durch den Diensthauptschlüssel gesichert wird
Dieses erste umfangreiche Beispiel hat die wichtigsten Vorgehensweisen bei der Verschlüsselung gezeigt, trotzdem bleiben natürlich noch eine Reihe wichtiger Fragen offen.

Sicherung von Schlüsseln und Zertifikaten

Der Verlust eines Schlüssels macht das Entschlüsseln der Daten unmöglich, daher ist es unbedingt notwendig ein Konzept für die Sicherung und Wiederherstellung der verschiedenen Schlüssel parat zu haben. Je nach Art des Schlüssels sind unterschiedliche Möglichkeiten der Sicherung und Wiederherstellung gegeben

Der Diensthauptschlüssel

Der Diensthauptschlüssel wird auch verwendet, um die Kennwörter von SQL Server Anmeldungen, Informationen über Verbindungsserver und Anmeldenamen verwendet. Daher sollte in jedem Fall ein Backup des Diensthauptschlüssel erstellt und sicher aufbewahrt werden:
-- Sichern des Diensthauptschluessels
BACKUP SERVICE MASTER KEY
      TO FILE = 'C:\SAFE\inst05.smk'
      ENCRYPTION BY PASSWORD = '2P%tsKDnT2gTmotS&sPd'

Listing: Erstellen einer Sicherungsdatei für den Diensthauptschlüssel
Da die Datenbankhauptschlüssel auch mit dem zugehörigen Kennwort wieder geöffnet werden können, ist der Diensthauptschlüssel für den Zugriff auf den Datenbankschlüssel und alle mit diesem verschlüsselten Objekte nicht zwingend erforderlich.

Der Datenbankhauptschlüssel

Auch der Datenbankhauptschlüssel sollte in jedem Fall separat gesichert werden, falls der Schlüssel dazu verwendet wird asymmetrische Schlüssel und Zertifikate in der Datenbank abzusichern.
-- Sichern des Datenbankhauptschlüssels
OPEN MASTER KEY
       DECRYPTION BY PASSWORD = '§Bzm7/Uc.W'
BACKUP MASTER KEY TO FILE = 'C:\SAFE\dbname.key'
       ENCRYPTION BY PASSWORD = 'a@wtfDuW23!X#';

Listing: Sichern des Datenbankhauptschlüssels in einer Datei

Zertifikate

Wurde das Zertifikat von einer externen Quelle importiert, so sollten bereits Sicherungen des öffentlichen und privaten Schlüssels vorliegen. Handelt es sich um ein vom SQL Server selbst signiertes Zertifikat, wie im vorangegangen Beispiel, so kann das Zertifikat mit der Anweisung BACKUP CERTIFICATE gesichert werden. Dabei werden der öffentliche und der private Schlüssel in zwei getrennten Dateien abgelegt. Der private Schlüssel wird durch ein Kennwort geschützt:
-- Sichern eines Zertifikats
BACKUP CERTIFICATE KontoZertifikat
       TO FILE = 'C:\SAFE\Kontozertifikat.cer'
       WITH PRIVATE KEY
       ( FILE = 'C:\SAFE\Kontozertifikat.pvk',
         ENCRYPTION BY PASSWORD = '*2W@3UgmLs8Db',
         DECRYPTION BY PASSWORD = '#Et4Wrzucp*' )

Listing: Sichern des öffentlichen und privaten Schlüssels eines Zertifikats in Dateien
Ein so gesichertes Zertifikat kann mit Hilfe der CREATE CERTIFICATE-Anweisung wieder erstellt werden. Das Vorgehen dabei ist das gleiche wie beim Importieren bereits bestehender Zertifikate:
CREATE CERTIFICATE KontoZertifikat
       FROM FILE = 'C:\SAFE\Kontozertifikat.cer'
       WITH PRIVATE KEY
       (FILE = 'C:\SAFE\Kontozertifikat.pvk',
        DECRYPTION BY PASSWORD = '*2W@3UgmLs8Db',
        ENCRYPTION BY PASSWORD='!n§pr1Ras6Ha5!');
GO
Listing: Erstellen eines Zertifikats aus Zertifikatsdatei und privatem Schlüssel

Asymmetrische Schlüssel

Asymmetrische Schlüssel, die direkt im SQL Server 2005 erstellt wurden, können nicht explizit gesichert werden. Um diese Schlüssel wieder herzustellen, muss eine Datenbanksicherung verwendet werden. Wurde der Schlüssel jedoch aus einer Datei oder einer Assembly extrahiert, so kann der Schlüssel natürlich erneut geladen werden:
-- Erstellen eins asymmetrischen Schlüssels
-- aus einer „strong-name“ Datei
CREATE ASYMMETRIC KEY AsymSchluessel
       FROM FILE = 'C:\asymkey.snk'
       ENCRYPTION BY PASSWORD = 'sK4)[@ww2kTs'

Listing: Erstellen eines asymmetrischen Schlüssels aus einer „Strong-Name“ Schlüsseldatei

Symmetrische Schlüssel

Da für die eigentliche Verschlüsselung der Daten in der Regel symmetrische Schlüssel verwendet werden, dürfen diese Schlüssel natürlich auch nicht verloren gehen. Eine explizite Sicherung der Schlüssel ist jedoch nicht möglich. Um einen symmetrischen Schlüssel wiederherzustellen muss auch hier in der Regel die Datenbank wiederhergestellt werden.
Leider ist im SQL Server kein Schutz vor dem Löschen eines symmetrischen Schlüssels möglich (Keine Panik! Das bedeutet natürlich nicht, dass ein symmetrischer Schlüssel einfach „von jedem“ gelöscht werden kann. Für die DROP SYMMETRIC KEY-Anweisung wird die CONTROL-Berechtigung für den Schlüssel benötigt).
Die Anweisung DROP SYMMETRIC KEY kann übrigens auch nicht durch DDL-Triggern abgefangen bzw. verhindert werden.
Falls man eine exakte Kopie eines symmetrischen Schlüssels erzeugen möchte, muss der Schlüssel mit einer „Passphrase“ (also einem Kennsatz – im Gegensatz zu einem Kennwort) und einem Identitätsausdruck erzeugt werden. Der Identitätsausdruck wird für das Generieren der GUID des Schlüssels verwendet und muss daher in der Datenbank eindeutig sein. Wird der Schlüssel gelöscht, so kann ein identischer Schlüssel erzeugt werden, indem die gleiche Passphrase und der gleiche Identitätsausdruck wie beim Originalschlüssel angegeben werden; natürlich muss bei der Erzeugung auch der gleiche Verschlüsselungsalgorithmus gewählt werden, der Name des neuen Schlüssel und die Methode zum Verschlüsseln des Schlüssels selbst müssen hingegen nicht mit dem Originalschlüssel übereinstimmen.
Im folgenden Beispiel wird ein symmetrischer Schlüssel („LostIt“) mit Passphrase und Identitätswert erzeugt. Nach dem Verschlüsseln von Daten wird der Schlüssel gelöscht. Der neue Schlüssel „FoundIt“ verwendet die gleichen Werte für die Passphrase und den Identitätswert. Dadurch kann der neue Schlüssel für das Entschlüsseln der Daten verwendet werden.
-- Erstellen eines neuen symmetrischen Schlüssels
CREATE SYMMETRIC KEY LostIt
       WITH ALGORITHM=TRIPLE_DES,
       KEY_SOURCE = 'Leichter zu merken als zu erraten',
      IDENTITY_VALUE = 'Das gibt es nur einmal, das kommt nie wieder.'
     ENCRYPTION BY PASSWORD = '!AmE3Zqp@NeP4$'
-- Öffnen des Schlüssels
OPEN SYMMETRIC KEY LostIt
      DECRYPTION BY PASSWORD = '!AmE3Zqp@NeP4$'
-- Verschlüsseln eines Datensatzes mit dem neuen Schlüssel
INSERT INTO dbo.kontoinformationen (BLZ, Kontonr)
      VALUES (EncryptByKey(KEY_GUID('LostIt'), '70080000' ), EncryptByKey(KEY_GUID('LostIt'), '0123456789'))
-- Abrufen der Daten mit Entschlüsselung
SELECT CAST(DecryptByKey(BLZ) AS varchar(8)) BLZ, CAST(DecryptByKey(Kontonr) AS varchar(10)) Kontonr
      FROM dbo.kontoinformationen
-- Schließen des Schlüssels und anschließendes Löschen
CLOSE SYMMETRIC KEY LostIt
DROP SYMMETRIC KEY LostIt
-- Erstellen eines neuen symmetrischen Schlüssels mit identischen
-- Schlüsseloptionen:
CREATE SYMMETRIC KEY FoundIt
     WITH ALGORITHM = TRIPLE_DES,
     KEY_SOURCE = 'Leichter zu merken als zu erraten',
     IDENTITY_VALUE = 'Das gibt es nur einmal, das kommt nie wieder.'
     ENCRYPTION BY PASSWORD = 'wAlIdN32R@'
-- Der neue Schlüssel kann verwendet werden, um die mit “LostIt” verschlüsselten Daten zu lesen:
OPEN SYMMETRIC KEY FoundIt
     DECRYPTION BY PASSWORD = 'wAlIdN32R@'
SELECT CAST(DecryptByKey(BLZ) AS varchar(8)) BLZ,
              CAST(DecryptByKey(Kontonr) AS varchar(10)) Kontonr
            FROM dbo.kontoinformationen
CLOSE ALL SYMMETRIC KEYS

Listing: Beispiel für das Erstellen eines identischen symmetrischen Schlüssel nach Verlust des Originals
Autor: svenh
erstellt: juni 2006
online: oktober 2006
letzte änderung:
Leerraum

Dokument zum Drucken anzeigen
English Pages
Link-Tipp zum Thema "SQL": www.sqlteam.com/

Sehr umfangreich Site rund um den SQL Server