Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

O Oracle possui alguma função de hash integrada?


Sim:hash e criptografia (relacionados, mas não exatamente iguais) são todos feitos através do pacote SYS DBMS_CRYPTO.

Hashing simples de SHA-1
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_SH1 );

Hashing MD5 simples
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_MD5 );

Visão geral de dbms_crypto.hash()

A função hash() está sobrecarregada para aceitar os seguintes tipos:RAW, BLOB e CLOB. De acordo com as conversões de dados implícitos para tipos de entrada brutos aceitáveis ​​são RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Todos os outros tipos de dados (DATE, TIMESTAMP, etc) não cobertos pela conversão RAW/implícita RAW, BLOB e CLOB terão que ser passados ​​por TO_CHAR() primeiro.

Vale a pena notar que dbms_crypto.hash() suporta os seguintes algoritmos de hash:
  • HASH_MD4
  • HASH_MD5
  • HASH_SH1

Senhas:por precaução

Se você estiver armazenando senhas, sugiro que use um hash de armazenamento de senha (bcrypt, PBKDF2 ou scrypt) em vez de um hash criptográfico (md5, sha-1, etc). A diferença é que os hashes de armazenamento de senha devem levar tempo para serem quebrados, enquanto os hashes criptográficos devem ser feitos rapidamente. Ao atacar a lista de senhas de um sistema por meio de força bruta, é muito mais demorado ao tentar quebrar um valor salgado que é passado por um algoritmo criptográfico. Considere que usar um hash de senha em um único valor pode levar ~ 100ms (não muito para um único login autêntico), mas muito lento para uma força bruta (milhões/bilhões de tentativas por senha) em toda a sua lista de senhas.

Oracle odeia hashes de senha

Por que vale a pena, não conheço nenhum pacote da Oracle que forneça suporte a hash de senha. No entanto, você pode fazer isso usando 'loadjava ' e colocando uma implementação Java bcrypt dentro da JVM que é executada no RDBMS da Oracle. Você pode usar um empacotador PL/SQL para chamar sua classe Java que implementa bcrypt. Se você estiver usando uma camada intermediária, poderá usar muitas outras opções disponíveis nessa linguagem (.NET, PHP, Perl, Ruby, Python, Java, etc.) e pular a tentativa de usar 'loadjava'.

Eu quis dizer criptografia, não hashes!

Caso o hash que você precisa não seja coberto por dbms_crypto.hash(), você pode estar procurando por criptografia via dbms_crypto.encrypt, que funciona de maneira muito semelhante, exceto que aceita os seguintes tipos:
  • ENCRYPT_DES
  • ENCRYPT_3DES_2KEY
  • ENCRYPT_3DES
  • ENCRYPT_AES
  • ENCRYPT_PBE_MD5DES
  • ENCRYPT_AES128
  • ENCRYPT_AES192
  • ENCRYPT_AES256

Aqui está a documentação completa da 11gR2 em DBMS_CRYPTO . Todas as outras versões estão disponíveis em tahiti.oracle.com . Basta clicar na sua versão e procurar por 'dbms_crypto'.