Criptografia

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
LC_JK
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 46
Registrado em: Ter, 24 Ago 2004 2:02 pm
Localização: São Paulo
Contato:

Gostaria de saber como q faço para criptografar uma senha e depois poder descriptografar. Como posso fazer isso?! existe alguma função do Oracle ou teria q criar algum script para isso?!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Depende o caso... Você disse que quer criptografar uma senha e depois descriptografar. Nesse caso, a melhor forma é usar um HASH, ou seja, você gera uma chave única da sua senha que é impossível de descriptografar. Daí, você apenas compara essa chave com a chave que o usuário digitou... (dessa forma, nem mesmo um DBA ou as pessoas que criaram o sistema conseguem ver a senha que o user cadastrou).

Aqui tem um exemplo, tirado do AskTom:
http://asktom.oracle.com/pls/ask/f?p=49 ... 5412348059

Selecionar tudo

declare
  function digest( p_username in varchar2, p_password in varchar2 ) return varchar2 
  is
  begin
    return ltrim( to_char( dbms_utility.get_hash_value( 
      upper(p_username)||'/'||upper(p_password),
      1000000000, 
      power(2,30) ),
      rpad( 'X',29,'X')||'X' ) );
  end digest;
begin
  for x in ( select username from all_users where rownum < 20 )
  loop
    dbms_output.put_line( 'User: ' || rpad( x.username , 30 ) ||
                          ' digest: ' || digest( x.username, 'TIGER' ) 
    );
  end loop;
end;
/
User: SYS                            digest: 6869FA1A
User: SYSTEM                         digest: 79F08AFC
User: OUTLN                          digest: 5ABFB255
User: DBSNMP                         digest: 43415F6B
User: TRACESVR                       digest: 49CF26F6
User: CTXSYS                         digest: 4910C297
User: OEM                            digest: 69463BC2
User: ORDSYS                         digest: 6F048B2B
User: ORDPLUGINS                     digest: 6547459C
User: MDSYS                          digest: 43C0B367
User: AURORA$ORB$UNAUTHENTICATED     digest: 5073BBFC
User: WEB$CDEJESUS                   digest: 6FB5CDB6
User: SCOTT                          digest: 4307767C
User: WEB$SMAYFIEL                   digest: 71ED5065
User: UTILS                          digest: 5B7912B7
User: OAS_PUBLIC                     digest: 502BAE3A
User: WEBDB                          digest: 5A7AC149
User: WEB$RDRISCOL                   digest: 3E72D3F6
User: WEB$KWARREN                    digest: 7123F5A1

PL/SQL procedure successfully completed.

Agora, se você quer criptografar E descriptografar informações (por exemplo, a coluna de salários dos funcionários). Daí você pode usar uma DBMS do oracle. A Obfuscation toolkit. Este exemplo também foi tirado do asktom...
http://asktom.oracle.com/pls/ask/f?p=49 ... 1026226790

Selecionar tudo

ops$tkyte@DEV816> variable x varchar2(25)
ops$tkyte@DEV816> 
ops$tkyte@DEV816> exec :x := 'How Now Brown Cow';

PL/SQL procedure successfully completed.

ops$tkyte@DEV816> 
ops$tkyte@DEV816> declare
  2      l_data  varchar2(255);
  3  begin
  4      l_data := rpad( :x, (trunc(length(:x)/8)+1)*8, chr(0) );
  5  
  6      dbms_obfuscation_toolkit.DESEncrypt
  7          ( input_string => l_data,
  8        key_string   => 'MagicKey',
  9        encrypted_string=> :x );
 10  end;
 11  /

PL/SQL procedure successfully completed.

ops$tkyte@DEV816> 
ops$tkyte@DEV816> print x

X
-------------------------
Òr
albandes
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qui, 06 Out 2005 4:08 pm
Localização: Pelotas - RS
---
Rogerio Albandes
PipeGrep Conectividade Ip - www.pipegrep.com.br
Fone: 53 3222-3366 Cel: 53 8401-4872

Eu venho do mysql , onde tem a função crypt() e a md5().
Apenas quero guardar as senhas dos usuarios de um sistema escrito em delphi, mas como tenho uma parte escrita e php, quero que esta criptografia seja feita pelo banco
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Infelizmente no ORACLE essa função não existe. Você terá que criar uma própria. (Essa DBMS usada no segundo exemplo acima é a solução p/ o seu problema: dbms_obfuscation_toolkit.

Ela é instalada junto com o ORACLE. Dá uma estudada nela! Qualquer dúvida, manda pra gente! Mas basicamente o que você tem que fazer, é criar uma função com as rotinas usadas nesse exemplo acima... (Que encripta e desencripta)...

:-o
alexander
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 13 Out 2005 12:18 pm
Localização: Rio de Janeiro

Este pacote de criptografia aceita qual tamanho maximo de texto para ser criptografado. Fiz um teste por aqui com um texto e com um atmanho de chave e se aumentasse o tamanho e diminuisse o tamanho da chave ou do texto dava erro.

Tem alguma referencia sobre tamanho ideal de chave e de texto.

Outra coisa, quando damos um wrap no codigo o que estiver entre aspas (texto) ele não e wrapeado. Fica visivel, alguma dica?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Poxa, não to tendo tempo pra testar aqui o tamanho máximo. Só sei que deve ser múltiplo de 8 caracteres. (veja o exemplo, tem um RPDAD que preenche com chr(0) a string.
Maikew
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 18 Jan 2012 8:55 am

Boa tarde pessoal, sou novo em Oracle, e não entendi muito bem a parte de criptografia, sei que existe pacotes no Oracle que podem ser utilizados para fazer esta operação. Mas como faço para criar uma funçao utilizando o DBMS_OBFUSCATION_TOOLKIT.DESEncrypt? Eu teria que utilizar uma função para encriptar e outra para desencriptar é isso?, no caso DBMS_OBFUSCATION_TOOLKIT.DESDecrypt?

alguém poderia me passar uma função de exemplo simples de função de criptografia, pois não entendi como usar esse o DBMS_OBFUSCATION_TOOLKIT :?

seria algo mais ou menos assim?

Selecionar tudo

CREATE OR REPLACE FUNCTION fn_criptografia
(
  p_login IN RAW
 ,p_senha IN RAW
 ,p_senha_encriptada OUT RAW
) RETURN RAW AS
  v_result RAW(128);
BEGIN
 DBMS_OBFUSCATION_TOOLKIT.DESEncrypt (p_login, p_senha, p_senha_encriptada);

RETURN v_result;
END;

Agradeço desde já o/
Maikew
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 18 Jan 2012 8:55 am

Maikew escreveu:Boa tarde pessoal, sou novo em Oracle, e não entendi muito bem a parte de criptografia, sei que existe pacotes no Oracle que podem ser utilizados para fazer esta operação. Mas como faço para criar uma funçao utilizando o DBMS_OBFUSCATION_TOOLKIT.DESEncrypt? Eu teria que utilizar uma função para encriptar e outra para desencriptar é isso?, no caso DBMS_OBFUSCATION_TOOLKIT.DESDecrypt?

alguém poderia me passar uma função de exemplo simples de função de criptografia, pois não entendi como usar esse o DBMS_OBFUSCATION_TOOLKIT :?

seria algo mais ou menos assim?

Selecionar tudo

CREATE OR REPLACE FUNCTION fn_criptografia
(
  p_login IN RAW
 ,p_senha IN RAW
 ,p_senha_encriptada OUT RAW
) RETURN RAW AS
  v_result RAW(128);
BEGIN
 DBMS_OBFUSCATION_TOOLKIT.DESEncrypt (p_login, p_senha, p_senha_encriptada);

RETURN v_result;
END;

Agradeço desde já o/
Só gostaria de um exemplo bem simples, para depois eu criar a minha propria chave :)
ricards
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 52
Registrado em: Sáb, 29 Set 2007 12:59 am
Localização: Araraquara-SP
Contato:
Ricardo Neves
Analista e Instrutor Oracle Developer
Java Developer (JPA/JSF/Hibernate/WebServices/EJB)

Você poderá criar um função para utilizar MD5 dessa forma no oracle

Selecionar tudo

create or replace function fnc_md5 (p_valor varchar) return varchar2 is
     v_entrada varchar2(2000) := p_valor;
     hexkey varchar2(32) := null;
begin
   hexkey := rawtohex(dbms_obfuscation_toolkit.md5(input => utl_raw.cast_to_raw(v_entrada)));
   return nvl(hexkey,'');
end;
/
Maikew
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 18 Jan 2012 8:55 am

ricards escreveu:Você poderá criar um função para utilizar MD5 dessa forma no oracle

Selecionar tudo

create or replace function fnc_md5 (p_valor varchar) return varchar2 is
     v_entrada varchar2(2000) := p_valor;
     hexkey varchar2(32) := null;
begin
   hexkey := rawtohex(dbms_obfuscation_toolkit.md5(input => utl_raw.cast_to_raw(v_entrada)));
   return nvl(hexkey,'');
end;
/
Obrigado. Eu já conhecia essa função de MD5, porém eu preciso desencriptar a senha, preciso do valor original dela, pois eu não vou comparar o valor do hash com outro hash gerado a partir da senha digitada, vou precisar usar a senha original em outro local, só queria um exemplo de como construir uma chave, o mais simples possivel de como utilizar a dbms_obfuscation_toolkit.DESEncrypt() e dbms_obfuscation_toolkit.DESDEcrypt() se possível.

:)
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

Do 10g em diante utilize o DBMS_CRYPTO.
O DBMS_OBFUSCATION_TOOLKIT já está descontinuado...

Abraços,
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes