Jeg fik fornøjelsen af at sidde og lege lidt med Oracle krypterings rutiner her forleden. Kort fortalt er nedenstående et par rutiner til at kryptere kolonner i dine tabeller, i Oracle.

Udgangs punktet er en tabel der kaldes SYSTEM_ hvori jeg gemmer brugernavne og tilhørende passwords.

CREATE TABLE SYSTEM_ (Systemname VARCHAR2(50), Username VARCHAR(20), Password VARCHAR2(50), Note VARCHAR2(100));

Herefter er forudsætningerne at DBMS_CRYPTO er lagt på databasen, hvis den ikke er det gøres følgende.

[workday::/home1/usr/oracle/kbirch] sqlplus / as sysdba
 
SQL*Plus: Release 11.1.0.6.0 - Production on To Sep 25 08:40:52 2008
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
Angiv password   :
 
Forbindelse er oprettet til :
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SQL> @$ORACLE_HOME/rdbms/admin/dbmsoctk.sql
 
Package created.

Package body created.

Synonym created.

SQL> grant execute on dbms_crypto to dsb;
 
Grant succeded.

Herefter er det bare at skrive et par rutiner til kryptering- og dekryptering
 
Create or replace package crypt_it as
  procedure encode_string (vString varchar2, vKey varchar2, vSystem varchar2);
  procedure decode_string (vKey varchar2, vSystem varchar2);
end;
 
Create or replace package body crypt_it as
  procedure encode_string (vString varchar2, vKey varchar2, vSystem varchar2) is
  Crypted   RAW(2048);
  Decrypted   RAW(2048);
  cString   RAW(128) := utl_raw.cast_to_raw(vString);
  cKey      RAW(128) := utl_raw.cast_to_raw(vKey);
  begin
     Crypted := dbms_crypto.encrypt(cString, dbms_crypto.des_cbc_pkcs5, cKey);
     UPDATE system_ SET PASSWORD = Crypted WHERE systemname = vSystem;
     COMMIT;
  end;
 
procedure decode_string (vKey varchar2, vSystem varchar2) is
  Crypted     RAW(2048);
  Decrypted   RAW(2048);
  cKey        RAW(128) := utl_raw.cast_to_raw(vKey);
  begin
     FOR i IN (SELECT systemname, username, PASSWORD FROM system_ WHERE systemname = VSystem) LOOP
         Crypted   := i.PASSWORD;
      Decrypted := dbms_crypto.decrypt(src => Crypted, typ => dbms_crypto.des_cbc_pkcs5, key => cKey);
         dbms_output.put_line('System: '||i.systemname||' Username: '||i.username||' Password: '||utl_raw.cast_to_varchar2(Decrypted));
     END LOOP;
  end;
end;
 
En fejl i ovenstående kan være længende på din key; er den under 8 karakterer får du denne fejl

ora-28234 key not long enough

Ellers kan man efterfølgende kryptere vha. (fordudsat rækken med systemname Metalink eksisterer)

begin
   crypt_it.encode_string('secret_password','MYSECUREKEY','Metalink');
end;

Og hentes frem vha.

begin
   crypt_it.decode_string('MYSECUREKEY','Metalink');
end;