2009-11-17 10 views
14

Oracleデータベースのselectに行のsha1ハッシュを作成する際に問題があります。私はMSSQLで次のようにしています。Oracleの行のsha1ハッシュを作成

SELECT *,HASHBYTES('SHA1',CAST(ID as varchar(10)+ 
    TextEntry1+TextEntry2+CAST(Timestamp as varchar(10)) as Hash 
FROM dbo.ExampleTable 
WHERE ID = [foo] 

しかし、私はOracleで作業するときに同様の機能を使用することはできません。 私のグーグルが私を連れて来た限り、私はdbms_crypto.hash_sh1がそれと何か関係があると推測していますが、まだ私の脳を包み込むことができませんでした...

感謝。

答えて

23

パッケージDBMS_CRYPTOは、ハッシュを生成する正しいパッケージです。デフォルトでPUBLICには付与されていませんので、特別に付与する必要があります(GRANT EXECUTE ON SYS.DBMS_CRYPTO TO user1)。

この関数の結果はデー​​タ型がRAWです。 RAWカラムに保存するか、RAWTOHEXまたはUTL_ENCODE.BASE64_ENCODE機能を使用してVARCHAR2に変換することができます。

HASH関数は、入力としてRAW,CLOBおよびBLOBという3つのデータ型を受け入れるようにオーバーロードされています。 rules of implicit conversionのために、VARCHAR2を入力として使用すると、OracleはこれをRAWに変換しようとしますが、この変換は16進文字列でのみ機能するため、失敗する可能性があります。

あなたがVARCHAR2を使用する場合は、例えば、バイナリデータ型またはCLOBへの入力を変換する必要があります。

DECLARE 
    x RAW(20); 
BEGIN 
    SELECT sys.dbms_crypto.hash(utl_raw.cast_to_raw(col1||col2||to_char(col3)), 
           sys.dbms_crypto.hash_sh1) 
    INTO x 
    FROM t; 
END; 

あなたはDBMS_CRYPTO.hash

+2

ありがとうございます。私はdbms_crypto.hash_sh1の値を定数の代わりに使用しなければなりませんでした。 SELECT sys.dbms_crypto.hash(utl_raw.cast_to_raw(col1)、3)FROM t; – PrometheusDrake

+2

私はこれが11g R2のために正確だとは思わない。 'dbms_crypto.hash'には、' raw'、 'blob'、' clob'の3つのオーバーロードされたバージョンがあるようです。 'varchar2'の値は' utl_i18n.string_to_raw'または 'utl_raw.cast_to_raw'のどちらかで' raw'に明示的に変換されなければなりません。また、文字データに 'clobs'を使うこともできます。 – user272735

+0

文字列データ型を持たない列がある場合はどうなりますか? – ca9163d9

7

DBMS_CRYPTOのドキュメントに追加情報が表示されますパッケージはvarchar2をサポートしていません。それは生の型で動作しますので、varchar2が必要な場合は変換する必要があります。

declare 
    p_string varchar2(2000) := 'Hello world !'; 
    lv_hash_value_md5 raw (100); 
    lv_hash_value_sh1 raw (100); 
    lv_varchar_key_md5 varchar2 (32); 
    lv_varchar_key_sh1 varchar2 (40); 
begin 
    lv_hash_value_md5 := 
    dbms_crypto.hash (src => utl_raw.cast_to_raw (p_string), 
         typ => dbms_crypto.hash_md5); 

    -- convert into varchar2 
    select lower (to_char (rawtohex (lv_hash_value_md5))) 
    into lv_varchar_key_md5 
    from dual; 

    lv_hash_value_sh1 := 
    dbms_crypto.hash (src => utl_raw.cast_to_raw (p_string), 
         typ => dbms_crypto.hash_sh1); 

    -- convert into varchar2 
    select lower (to_char (rawtohex (lv_hash_value_sh1))) 
    into lv_varchar_key_sh1 
    from dual; 

    -- 
    dbms_output.put_line('String to encrypt : '||p_string); 
    dbms_output.put_line('MD5 encryption : '||lv_varchar_key_md5); 
    dbms_output.put_line('SHA1 encryption : '||lv_varchar_key_sh1); 
end; 
3

この関数は、utils_pkgで定義した好きなパッケージで定義できます。

FUNCTION SHA1(STRING_TO_ENCRIPT VARCHAR2) RETURN VARCHAR2 AS 
BEGIN 
RETURN LOWER(TO_CHAR(RAWTOHEX(SYS.DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW(STRING_TO_ENCRIPT), SYS.DBMS_CRYPTO.HASH_SH1)))); 
END SHA1; 

今すぐ

SELECT UTILS_PKG.SHA1('My Text') AS SHA1 FROM DUAL; 

それを呼び出すために応答が

SHA1 
-------------------------------------------- 
5411d08baddc1ad09fa3329f9920814c33ea10c0 

であるあなたは、いくつかのテーブルから列を選択することができます。

SELECT UTILS_PKG.SHA1(myTextColumn) FROM myTable; 

をお楽しみください!

関連する問題