sql >> Database >  >> RDS >> Oracle

Oracle-gegevensmaskering

Dit probleem is eenvoudig op te lossen in 12c met de functie STANDARD_HASH .

De oplossing in eerdere versies is alleen iets gecompliceerder. Bouw een eenvoudige wrapper rond DBMS_CRYPTO die net als STANDARD_HASH werkt:

--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;
/

Mogelijk moet u zich aanmelden met SYS en uw gebruiker toegang verlenen tot DBMS_CRYPTO om de functie te laten werken:

grant execute on sys.dbms_crypto to <your_schema>;

Maak een openbaar synoniem, geef het aan iedereen en het werkt op precies dezelfde manier.

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

Hier is een eenvoudig voorbeeld van het gebruik van de functie:

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

Maar het bijwerken van grote hoeveelheden gegevens kan traag zijn. Het kan sneller zijn om een ​​nieuwe tabel te maken, de oude weg te laten, de nieuwe te hernoemen, enz. En de hash-waarde kan groter zijn dan de kolomgrootte, het kan nodig zijn om alter table some_table modify column1 varchar2(40 byte);

Het verbaast me hoeveel producten en tools er zijn om zoiets eenvoudigs te doen.



  1. Hoe Android veilig te verbinden met mysql-database

  2. mysql cte . gebruiken met en invoegen waarschuwt een syntaxisfout

  3. Moeten we sorteerkolom, primaire sleutel op samengestelde index (MySQL) opnemen

  4. Oracle LIMIT n,m equivalent