Pular para o conteúdo
  • Este tópico contém 2 respostas, 3 vozes e foi atualizado pela última vez 7 anos, 1 mês atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 3 posts - 1 até 3 (de 3 do total)
  • Autor
    Posts
  • #108941
    Avatar de airoospairoosp
    Participante

      Boa tarde,

      Temos aqui os bancos 10g e 11g, ambos em Windows. É possível no momento de incluir informação em um campo de uma tabela criptografar o que será gravado, usando recurso do próprio banco?

      Seria utilizar uma trigger por exemplo:

      .
      .
      before insert on cadastropeca
      declare
      v_cripto varchar2(20)
      .
      .
      begin

      if :new.codalmox is not null then

      v_cripto:=criptografar(:new.codalmox);

      :new.codalmox:=v_cripto;

      end if;

      end;

      Se alguém tiver alguma dica, agradeço.

      Obrigado.

      Airton

      #108942
      Avatar de spernegaspernega
      Participante

        Boa tarde,

        tem o DBMS_OBFUSCATION_TOOLKIT.

        A gente usa assim aqui:

        CREATE OR REPLACE PACKAGE toolkit AS
        FUNCTION encrypt (p_text IN VARCHAR2) RETURN RAW;
        FUNCTION decrypt (p_raw IN RAW) RETURN VARCHAR2;
        END toolkit;
        /

        CREATE OR REPLACE PACKAGE BODY toolkit AS
        g_key RAW(32767) := UTL_RAW.cast_to_raw(‘12345678’);
        g_pad_chr VARCHAR2(1) := ‘~’;
        PROCEDURE padstring (p_text IN OUT VARCHAR2);


        FUNCTION encrypt (p_text IN VARCHAR2) RETURN RAW IS


        l_text       VARCHAR2(32767) := p_text;
        l_encrypted  RAW(32767);
        

        BEGIN
        padstring(l_text);
        DBMS_OBFUSCATION_TOOLKIT.desencrypt(input => UTL_RAW.cast_to_raw(l_text),
        key => g_key,
        encrypted_data => l_encrypted);
        RETURN l_encrypted;
        END;



        FUNCTION decrypt (p_raw IN RAW) RETURN VARCHAR2 IS


        l_decrypted  VARCHAR2(32767);
        

        BEGIN
        DBMS_OBFUSCATION_TOOLKIT.desdecrypt(input => p_raw,
        key => g_key,
        decrypted_data => l_decrypted);

        RETURN RTrim(UTL_RAW.cast_to_varchar2(l_decrypted), g_pad_chr);
        

        END;



        PROCEDURE padstring (p_text IN OUT VARCHAR2) IS


        l_units  NUMBER;
        

        BEGIN
        IF LENGTH(p_text) MOD 8 > 0 THEN
        l_units := TRUNC(LENGTH(p_text)/8) + 1;
        p_text := RPAD(p_text, l_units * 8, g_pad_chr);
        END IF;
        END;


        END toolkit;
        /

        Select toolkit.decrypt(‘193BC945CD62FCA3517DCD01378EE317’) from dual;

        #108943
        Avatar photoJosé Laurindo Chiappa
        Moderador

          Blz ? Então, seja num banco Oracle 10g, 11g ou 12c (e qquer que seja o Release) o modo Recomendado de se fazer isso sem ter que sair escrevendo código é vc comprar o add-on chamado ORACLE TRANSPARENT DATA ENCRYPTION : com esse produto adquirido (ele é vendido á parte) vc passa a ter a encriptação ** E ** a decriptação AUTOMÁTICAS, feitas on-the-fly pelo próprio RDBMS, daí o “Transparent” do nome do produto… Principalmente para aplicações onde vc não tem o fonte e/ou vc vai ter muitas aplicações diferentes acessando o banco (casos em que é IMPOSSÍVEL ou muito difícil vc codificar), o TDE é inestimável…. Veja http://www.oracleflash.com/26/Oracle-10g-Transparent-Data-Encryption-examples.html e http://www.oracle.com/ocom/groups/public/@otn/documents/webcontent/279376.htm além da documentação Oracle para refs sobre o assunto…

          CASO porém vc não disponha do TDE (porque não tem verba pra adquirir ele, ou seja por que for), aí vc é que vai ter que ** ESCREVER ** rotinas para criptografar E para decriptografar… Pode ser feito mas o principal senão é que vc passa a ter o acesso aos dados restrito à sua aplicação – com CERTEZA, as eventuais ferramentas outras de relatórios, de BI, de segurança/Auditoria de dados, etc, etc, não vão conseguir decriptografar os dados, pois vc os encriptou com um algoritmo seu…
          SE essa restrição não te afeta, ok : o método rotineiramente usado para criptografia faça-você-mesmo é a package DBMS_CRYPTO : dá uma lida nos capítulos ref. Database Security dos manuais Oracle (tanto pro 10g quanto pro 11g, pra pegar as eventuais mínimas diferenças entre versões) pra sintaxes e guias gerais, e como ref/exemplo de uso veja http://www.oracleflash.com/41/Encrypt-or-Decrypt-sensitive-data-using-PLSQL-DBMS_CRYPTO.html#751729369202328132 , http://www.databasejournal.com/features/oracle/article.php/3506421/Oracle-10g-PLSQL-Enhancements-Part-1-DBMSCRYPTO-DBMSMONITOR-and-DBMSSERVERALERT.htm e https://stackoverflow.com/questions/12058356/encrypt-decrypt-password-in-oracle-function

          []s

          Chiappa

          OBS :

          a. antes do banco 10g a opção oferecida era a package DBMS_OBFUSCATION_TOOLKIT, que é ** muito ** mais fraca, usa um algoritmo interno do RDBMS baseado em salts : a vantagem do DBMS_CRYPTO é que ela permite que vc use algoritmos de criptografia IMENSAMENTE MAIS SOFISTICADOS E SEGUROS do que hash+salt, como por exemplo 3DES …

          b. é importante dizer que vc está no controle total quando opta por criptografia manual, então ALÉM de escrever as rotinas que encriptam e decriptam E fazer a tua aplicação as chamar quando for ler E quando for gravar dados, OUTRA tarefa que ficará ABSOLUTAMENTE POR SUA CONTA é gerenciar as chaves de criptografia….

        Visualizando 3 posts - 1 até 3 (de 3 do total)
        • Você deve fazer login para responder a este tópico.
        plugins premium WordPress