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;