Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Maskowanie danych Oracle

Ten problem można łatwo rozwiązać w 12c za pomocą funkcji STANDARD_HASH .

Rozwiązanie w poprzednich wersjach jest tylko nieco bardziej skomplikowane. Zbuduj proste opakowanie wokół DBMS_CRYPTO, które działa jak 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;
/

Może być konieczne zalogowanie się za pomocą SYS i przyznanie użytkownikowi dostępu do DBMS_CRYPTO, aby funkcja działała:

grant execute on sys.dbms_crypto to <your_schema>;

Utwórz publiczny synonim, przyznaj go wszystkim i działa dokładnie w ten sam sposób.

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

Oto prosty przykład użycia funkcji:

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

Jednak aktualizowanie dużych ilości danych może być powolne. Szybciej może być utworzenie nowej tabeli, usunięcie starej, zmiana nazwy nowej itp. A wartość hash może być większa niż rozmiar kolumny, może być konieczne alter table some_table modify column1 varchar2(40 byte);

Zdumiewa mnie, ile jest produktów i narzędzi do wykonania tak prostej rzeczy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle InvalidOperationException — podczas próby wyboru z tabeli

  2. Prosty sposób na uruchomienie skryptu sqlplus z java

  3. Przykłady ciągów i liczb konkatenacji Oracle

  4. Tomcat 6/7 JNDI z wieloma źródłami danych

  5. Napotkany błąd SQL:ORA-01843:niepoprawny miesiąc