Oracle
 sql >> Base de données >  >> RDS >> Oracle

Masquage des données Oracle

Ce problème est facilement résolu en 12c avec la fonction STANDARD_HASH .

La solution dans les versions précédentes n'est que légèrement plus compliquée. Construisez un wrapper simple autour de DBMS_CRYPTO qui agit comme STANDARD_HASH :

--Imitation of the 12c function with the same name.
--Remember to drop this function when you upgrade!
create or replace function standard_hash(
    p_string varchar2,
    p_method varchar2 default 'SHA1'
) return varchar2 is
    v_method number;
    v_invalid_identifier exception;
    pragma exception_init(v_invalid_identifier, -904);
begin
    --Intentionally case-sensitive, just like the 12c version.
    if p_method = 'SHA1' then
        v_method := dbms_crypto.hash_sh1;
    --These algorithms are only available in 12c and above.
    $IF NOT DBMS_DB_VERSION.VER_LE_11 $THEN
        elsif p_method = 'SHA256' then
            v_method := dbms_crypto.hash_sh256;
        elsif p_method = 'SHA384' then
            v_method := dbms_crypto.hash_sh384;
        elsif p_method = 'SHA512' then
            v_method := dbms_crypto.hash_sh512;
    $END
    elsif p_method = 'MD5' then
        v_method := dbms_crypto.hash_md5;
    else
        raise v_invalid_identifier;
    end if;

    return rawToHex(dbms_crypto.hash(utl_raw.cast_to_raw(p_string), v_method));
end;
/

Vous devrez peut-être vous connecter avec SYS et accorder à votre utilisateur l'accès à DBMS_CRYPTO pour que la fonction fonctionne :

grant execute on sys.dbms_crypto to <your_schema>;

Créez un synonyme public, accordez-le à tout le monde, et cela fonctionnera exactement de la même manière.

create public synonym standard_hash for <schema with function>.standard_hash;
grant execute on standard_hash to public;

select standard_hash('Some text', 'MD5') from dual;
    9DB5682A4D778CA2CB79580BDB67083F

select standard_hash('Some text', 'md5') from dual;
    ORA-00904: : invalid identifier

Voici un exemple simple d'utilisation de la fonction :

update some_table
set column1 = standard_hash(column1),
    column2 = standard_hash(column2);

Mais la mise à jour de grandes quantités de données peut être lente. Il peut être plus rapide de créer une nouvelle table, de supprimer l'ancienne, de renommer la nouvelle, etc. Et la valeur de hachage peut être supérieure à la taille de la colonne, il peut être nécessaire de alter table some_table modify column1 varchar2(40 byte);

Je suis étonné de voir combien de produits et d'outils existent pour faire une chose aussi simple.