2017-05-12 27 views
0

clairのパスワードを使用しているテーブルの一部に、将来のパスワードが暗号化されるJavaアプリケーションにアップグレードしました。Oracle:パスワードの暗号化

しかし、このバージョンをリリースする前に、私は既存のパスワードを暗号化する必要があります。

これは、文字列からBlowfish文字列に、そして最終的には16進文字列にclairのパスワードを暗号化するpl/sql Oracleの方法ですか?以下である

Javaコードは:

public static String crypt(String plaintext) throws GinException 
{ 
    return toHexString(crypt(plaintext.getBytes())); 
} 

private static byte[] crypt(byte[] plaintext) throws GinException 
{ 
    try 
    { 
     Cipher cipher = Cipher.getInstance("Blowfish"); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
     return cipher.doFinal(plaintext);  
    } 
    catch (Exception e) 
    { 
     throw new GinException(e.getMessage()); 
    } 
} 


// Convert a byte array to a hex string. 
private static String toHexString (byte[] b) 
{ 
    StringBuffer sb = new StringBuffer(b.length * 2); 
    for (int i=0; i<b.length; i++) 
    { 
     // look up high nibble char 
     sb.append(hexChar [(b[i] & 0xf0) >>> 4]); // fill left with zero bits 

     // look up low nibble char 
     sb.append(hexChar [b[i] & 0x0f]); 
    } 
    return sb.toString(); 
} 
+0

'DBMS_CRYPTO'は良い出発点です。このリンクを確認してください - > https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_crypto.htm#BJFGFDFG – g00dy

+2

パスワードは**暗号化してはいけません**、暗号化する必要があります**ハッシュ**。これについて混乱させるべきではありません。もしあなたがそうであれば、今や将来私は自分自身にアクセスする可能性があるあらゆる環境でパスワードセキュリティを担当していないことを願っています。 – mathguy

答えて

0

あなたはPL/SQLからJavaを呼び出すことができます。複雑すぎることはありませんが、正確なプロセスを見つけるためには研究を行う必要があります。あなたが暗号化アルゴリズムに限定されていない場合 は、あなたが例えば、他の使用することができます。

CREATE OR REPLACE PACKAGE Cryptit AS 
    FUNCTION encrypt(Str VARCHAR2) RETURN RAW; 
    FUNCTION decrypt(xCrypt VARCHAR2) RETURN VARCHAR2; 
    FUNCTION encrypt_with_key(Str VARCHAR2, key VARCHAR2) RETURN RAW; 
    FUNCTION decrypt_with_key(xCrypt VARCHAR2, key VARCHAR2) RETURN VARCHAR2; 
END Cryptit; 
/

CREATE OR REPLACE PACKAGE BODY Cryptit AS 
    crypt_raw RAW(2000); 
    crypt_str VARCHAR(2000); 

    -- Encrypt the string -- 
    FUNCTION encrypt(Str VARCHAR2) RETURN RAW AS 

    l INTEGER := LENGTH(str); 
    i INTEGER; 
    padblock RAW(2000); 
    Cle RAW(8) := UTL_RAW.CAST_TO_RAW('frankzap'); 

    BEGIN 
     i := 8-MOD(l,8); 
     padblock := utl_raw.cast_to_raw(str||RPAD(CHR(i),i,CHR(i))); 

     dbms_obfuscation_toolkit.DESEncrypt(
       input  => padblock, 
       KEY  => Cle, 
       encrypted_data => crypt_raw); 
     RETURN crypt_raw ; 
    END; 

    -- Encrypt the string with user supplied encryption key -- 
    FUNCTION encrypt_with_key(Str VARCHAR2, key VARCHAR2) RETURN RAW AS 

    l INTEGER := LENGTH(str); 
    i INTEGER; 
    padblock RAW(2000); 
    Cle RAW(8) := UTL_RAW.CAST_TO_RAW(key); 

    BEGIN 
     i := 8-MOD(l,8); 
     padblock := utl_raw.cast_to_raw(str||RPAD(CHR(i),i,CHR(i))); 

     dbms_obfuscation_toolkit.DESEncrypt(
       input  => padblock, 
       KEY  => Cle, 
       encrypted_data => crypt_raw); 
     RETURN crypt_raw ; 
    END; 

    -- Decrypt the string -- 
    FUNCTION decrypt(xCrypt VARCHAR2) RETURN VARCHAR2 AS 
    l NUMBER; 
    Cle RAW(8) := UTL_RAW.CAST_TO_RAW('frankzap'); 
    crypt_raw RAW(2000) := utl_raw.cast_to_raw(utl_raw.cast_to_varchar2(xCrypt)) ; 
    BEGIN 
     dbms_obfuscation_toolkit.DESDecrypt(
       input  => xCrypt, 
       KEY  => Cle, 
       decrypted_data => crypt_raw); 
     crypt_str := utl_raw.cast_to_varchar2(crypt_raw); 
     l := LENGTH(crypt_str); 
     crypt_str := RPAD(crypt_str,l-ASCII(SUBSTR(crypt_str,l))); 
     RETURN crypt_str; 
    END; 

     -- Decrypt the string with user supplied decryption key -- 
    FUNCTION decrypt_with_key(xCrypt VARCHAR2, key VARCHAR2) RETURN VARCHAR2 AS 
    l NUMBER; 
    Cle RAW(8) := UTL_RAW.CAST_TO_RAW(key); 
    crypt_raw RAW(2000) := utl_raw.cast_to_raw(utl_raw.cast_to_varchar2(xCrypt)) ; 
    BEGIN 
     dbms_obfuscation_toolkit.DESDecrypt(
       input  => xCrypt, 
       KEY  => Cle, 
       decrypted_data => crypt_raw); 
     crypt_str := utl_raw.cast_to_varchar2(crypt_raw); 
     l := LENGTH(crypt_str); 
     crypt_str := RPAD(crypt_str,l-ASCII(SUBSTR(crypt_str,l))); 
     RETURN crypt_str; 
    END; 

END Cryptit; 
/

用法:

-- CRYPTIT functions usage example: 
set echo on 
set feedback on 
set serveroutput on 

DECLARE 
    LC$Code VARCHAR2(100) := 'Music is the best!' ; 
BEGIN 
    -- Get the encrypted string -- 
    LC$Code := Cryptit.Encrypt_with_key(LC$Code, 'yojoMama') ; 
    dbms_output.put_line(LC$Code) ; 

    -- Get the decrypted string -- 
    LC$Code := Cryptit.Decrypt_with_key(LC$Code, 'yojoMama') ; 

    dbms_output.put_line(LC$Code) ; 

END ; 
/


create table conn_string 
(

username varchar2(30), 
crypt_conn varchar2(100), 
instance varchar2(15) 
) 
; 

insert into conn_string 
values('CS_NOTEBOOK9', Cryptit.Encrypt_with_key('elnbukd452', 'yojoMama'), 'UKDEV452') 
; 

insert into conn_string 
values('CS_NOTEBOOK9', Cryptit.Encrypt_with_key('elnbukt452', 'yojoMama'), 'UKTST452') 
; 

insert into conn_string 
values('CS_NOTEBOOK9', Cryptit.Encrypt_with_key('elnbukv452', 'yojoMama'), 'UKVAL452') 
; 

insert into conn_string 
values('CS_NOTEBOOK9', Cryptit.Encrypt_with_key('elnbukt452', 'yojoMama'), 'UKTRN452') 
; 

insert into conn_string 
values('CS_NOTEBOOK9', Cryptit.Encrypt_with_key('elnbprd10', 'yojoMama'), 'UKPRD452') 
; 

insert into conn_string 
values('CS_LTA', Cryptit.Encrypt_with_key('elnbprd10', 'yojoMama'), 'UKPRD452') 
; 

select 
username 
, crypt_conn 
, Cryptit.Decrypt_with_key(crypt_conn, 'yojoMama') decrypt 
, instance 
from conn_string 
; 

rename conn_string to test_connect_details 
; 

create table test_set 
(test_set_name varchar2(100) 
, description varchar2(1000) 
) 
; 


create table test_case 
(test_set_name varchar2(100) 
, test_name varchar2(100) 
, description varchar2(1000) 
) 
; 

create table test_piece 
(test_set_name varchar2(100) 
, test_name varchar2(100) 
, piece_type varchar2(10) 
, piece_order number (6,3) 
, piece_text varchar2(4000) 
) 
; 


select 'SQLPLUS ' || username 
|| '/' || Cryptit.Decrypt_with_key(crypt_conn, 'yojoMama') 
|| '@' || instance 
|| ' ' || (select piece_text from test_piece b) cmd 

from test_connect_details a 
where upper(username) = 'CS_NOTEBOOK9' 
and upper(instance) = 'UKDEV452' 
; 


select to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') date_run 
, user 
, instance_name 
from v$instance; 
+0

残念ながら、私はBlowfish暗号化アルゴリズムに制限されています。私はそれを変更することはできません。 – kkung

+0

@kkungしたがって、Oracleのカーネルに実装されているJVMにJavaクラスをロードする方法を検討することをお勧めします。次に、JavaコードをPL/SQLプロシージャとしてラッパーすることができます。これについてはDocのものがたくさんありますが、ここではあまりにも言いたいことがあります。 –

関連する問題