sql >> Database teknologi >  >> RDS >> Oracle

Oracle datamaskering

Dette problem løses nemt i 12c med funktionen STANDARD_HASH .

Løsningen i tidligere versioner er kun lidt mere kompliceret. Byg en simpel indpakning omkring DBMS_CRYPTO, der fungerer ligesom 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;
/

Du skal muligvis logge på med SYS og give din bruger adgang til DBMS_CRYPTO for at få funktionen til at fungere:

grant execute on sys.dbms_crypto to <your_schema>;

Opret et offentligt synonym, giv det til alle, og det fungerer på nøjagtig samme måde.

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

Her er et simpelt eksempel på brug af funktionen:

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

Men opdatering af store mængder data kan være langsom. Det kan være hurtigere at oprette en ny tabel, slippe den gamle, omdøbe den nye osv. Og hashværdien kan være større end kolonnestørrelsen, det kan være nødvendigt at alter table some_table modify column1 varchar2(40 byte);

Det overrasker mig, hvor mange produkter og værktøjer der er til at gøre sådan en simpel ting.



  1. Hvordan forespørger man indlejrede arrays i en postgres json-kolonne?

  2. problem med at finde listen over filer i mappen

  3. Kører PostgreSQL ved hjælp af Amazon RDS

  4. Python mysql check for duplikat før indsættelse