Logo Oracle Deutschland   DBA Community  -  März 2013
DBMS_CRYPTO - Revisionssicherheit mit Bordmitteln
von Heinz-Wilhelm Fabry, ORACLE Deutschland B.V. & Co. KG

Das Package DBMS_CRYPTO ist Bestandteil jeder Edition der Datenbank, erfordert weder den Einsatz einer Enterprise Edition, noch setzt es die Lizenzierung einer Option voraus. Im Rahmen der DBA Community ist das Verschlüsseln von Daten mit DBMS_CRYPTO bereits in einem Artikel beschrieben worden. Das Package kann jedoch mehr als verschlüsseln. Man kann damit nämlich auch nachweisen, ob Daten in einer Tabelle verändert oder auch nicht verändert wurden. Dabei ist es unerheblich, ob der Nachweis einen einzelnen Wert in einer Tabellenzeile zum Ziel hat, eine Reihe von Werten einer Tabellenzeile oder gar eine ganze Zeilen einer Tabelle. Damit könnte man das Package zum Beispiel einsetzen, wenn eine revisionssichere Datenhaltung gefordert wird.

Der Tipp zeigt die Grundlagen, wie man mit dem Package arbeitet. Er will dem DBA und dem Anwendungsentwickler gleichermassen andeuten, was mit den 'Bordmitteln' der Datenbank erreicht werden kann.

Grundsätzliches

DBMS_CRYPTO ist ein Objekt aus dem Schema SYS. Ein Benutzer kann nur nach einem ausdrücklichen GRANT EXECUTE damit arbeiten. Das Package stellt zur Zeit drei Hashing Algorithmen zum Erzeugen von Prüfsummen bereit: MD4, MD5 und SHA-1. Die Verfahren MD5 und SHA-1 werden zusätzlich noch in einer passwortgeschützten Variante unterstützt: HMAC-MD5 und HMAC-SHA1.

Da MD4 nur zur Verfügung gestellt wird, damit nach wie vor mit Hash Werten gearbeitet werden kann, die mit dem inzwischen veralteten Package DBMS_OBFUSCATION_TOOLKIT erzeugt wurden, und da das Package MD5 bereits seit längerer Zeit als unsicher eingeschätzt wird, wird hier SHA-1 verwendet und zwar in der passwortgeschützten Variante.

Beispielszenario

Wie man mit Prüfsummen arbeitet soll an dem folgenden kleinen Beispiel ansatzweise gezeigt werden. Es verwendet die Tabelle EMP des Schemas SCOTT. Dem Benutzer SCOTT wird zunächst die Ausführungsberechtigung für das Package DBMS_CRYPTO über ein GRANT EXECUTE erteilt. SCOTT überprüft mit der Hash Funktion SHA-1, ob die Summe aus Gehalt (Spalte SAL) und Provision (Spalte COMM) verändert wurde. Dazu wird der Hash Wert für das Ergebnis der Addition über die von SCOTT zu erstellende Funktion TO_HASH ermittelt. Der ermittelte Hashwert wird in einer Hilfstabelle namens CHECKHASH abgelegt. Die Tabellen EMP und CHECKHASH sind über die Spalte EMPNO verbunden. Ein Vergleich des aktuellen Hashwerts mit dem gespeicherten Wert ermöglicht also den Nachweis der Veränderung oder auch der Nichtveränderung. Weil das Erzeugen des Hashwertes über ein Passwort abgesichert ist, kann der Hash Wert nur von einem Benutzer ermittelt werden, der dieses Passwort kennt.

Zunächst wird die Hilfstabelle CHECKHASH angelegt.
CREATE TABLE CHECKHASH(
	empno number(4),
	hashwert raw(50))
/
Jetzt wird die Funktion TO_HASH angelegt, die die Hash Werte erzeugt. Sie greift zurück auf das Package DBMS_CRYPTO.
CREATE OR REPLACE FUNCTION to_hash (eingabe IN NUMBER, schluessel IN VARCHAR2)
RETURN RAW
IS
  v_hashwert   	RAW(50); 					-- Variable für den Hashwert
  v_hash	PLS_INTEGER :=  DBMS_CRYPTO.HMAC_SH1;		-- Hashingalgorithmus SHA-1 mit Passwort
BEGIN
  IF schluessel <> 'oracle' THEN
  RAISE_APPLICATION_ERROR (-20222, 'Falsches Passwort');
  END IF;
  v_hashwert   := DBMS_CRYPTO.MAC(
		src => UTL_I18N.STRING_TO_RAW(eingabe, 'AL32UTF8'), -- DBMS_CRYPTO erfordert Datentyp RAW
		typ => v_hash,
		key => UTL_I18N.STRING_TO_RAW(schluessel));	    -- Schlüssel muss ebenfalls RAW sein
  RETURN v_hashwert;
END;
/
Unter Verwendung der Funktion TO_HASH werden die benötigten Daten aus der Tabelle EMP in die Tabelle CHECKHASH eingefügt. Das anschliessende SELECT zeigt das Ergebnis.
INSERT INTO checkhash 
	SELECT empno, to_hash(sal + nvl(comm, 0), 'oracle') FROM emp
/
SELECT * FROM checkhash
/
 EMPNO HASHWERT
------ --------------------------------------------------
  7369 9575745F8DB094777F36A086E8FCC3853168588C
  7499 C54F2E8728A66549E0A0C63B76A9EFF2F765D524
  7521 268E4DF0F0C4F1530F3BFEC7B7D27E8E24A33B68
  7566 294FE7C040DE16B59FFF99D1017FA4E3A3C9E2E3
  7654 CFBE25077AB05A96A6E7BB8F08C41F947CB4100E
  7698 09FD33380FF3A7073199F1DE9718FD8599406A85
  7782 B0353FC5CD213A5E9B6114D64C5AA9B3E4F302B3
  7788 A6262A8C5C3D46E4CF87827FDE43A05DEECF3EF6
  7839 EC102D5D098A0310F2529211DDD0719F9DEEC351
  7844 6B9C6376ECFECBF21BC34A41781107F1274E6B46
  7876 760DF3FBC5F2DCDAC1A9FC793866298135B76146
  7900 2F99B913DC77CDE11769CDCC5B6B5AB3C3C8C9D5
  7902 A6262A8C5C3D46E4CF87827FDE43A05DEECF3EF6
  7934 1D3C5954CBB259AA038BB82D6F161865B6BFE95D

14 rows selected.

Mögliche Ausbaustufen

Damit ist die Basis für die Absicherung der Daten aus den Spalten SAL und COMM gelegt. Das Beispiel lässt sich nun nach Belieben (oder zum eigenen Testen) erweitern. Eine Ausbaustufe könnte darauf abzielen, dass beim Einfügen eines Datensatzes in der Tabelle EMP, was ja die Einstellung eines neuen Mitarbeiters bedeuten würde, gleich auch die Angestelltennummer und der Hash Wert für diesen neuen Mitarbeiter mit einem INSERT Trigger in die Tabelle CHECKHASH übertragen wird.

Auch könnte man über einen Trigger, der die angelegte Funktion TO_HASH für einen Vergleich der Werte in CHECKHASH und EMP verwendet, bei jedem UPDATE auf die Tabelle EMP feststellen lassen, ob die fragliche Summe verändert wurde. Der Trigger könnte bei einer festgestellten Diskrepanz das UPDATE scheitern lassen oder einen Alert in Form einer Email auslösen. Oder es liesse sich in diesen Trigger einbauen, dass ein bestimmter Benutzer die Änderung der Spaltenwerte vornehmen darf.

Natürlich bleiben aber auch Fragen offen. So wird man in der Praxis sicherlich auch darüber nachdenken müssen, wie man die Tabelle CHECKHASH zusätzlich sichert. Eine einfache Variante bestünde darin, sie in einem anderen Schema anzulegen. Wenn solche oder ähnliche Massnahmen nicht ausreichen, könnte man, sofern man eine Enterprise Edition der Datenbank zur Verfügung hat, über den Einsatz des Feature Virtual Private Database oder der Option Database Vault nachdenken.

Zusätzlicher Hinweis

Dieser Tipp ersetzt nicht die Beschäftigung mit den relevanten Seiten aus dem Handbuch Packages and Types, die Auskunft geben über die Packages DBMS_CRYPTO und UTL.I18N.


Zurück zur Community-Seite