2012-05-06 2 views
1

C#.NetとOracle 10gの両方でSHA1アルゴリズムに基づいて一部の文字列を暗号化したいとします。 C#.NETでC#.NetとOracle間で異なる暗号化結果を取得

マイアルゴリズム:オラクルで

string salt = "123"; 
System.Security.Cryptography.SHA1 sha = System.Security.Cryptography.SHA1.Create(); 
byte[] preHash = System.Text.Encoding.UTF32.GetBytes(salt); 
byte[] hash = sha.ComputeHash(preHash); 

string password = System.Convert.ToBase64String(hash); 
password = password.Substring(0, 8); 

// password value is: "7yP7/lkJ" 

Create Or Replace Function Sha1(P_Value Varchar2,P_Length Number) Return Varchar2 
Is 
P_String Varchar2(2000) := P_Value ; 
L_Hash_Value_Raw Raw (100);  
Lv_Hash_Value_Varchar Varchar2 (40); 
Begin 
    L_Hash_Value_Raw := Dbms_Crypto.Hash (Src => Utl_Raw.Cast_To_Raw(P_String),  
             Typ => Dbms_Crypto.Hash_Sh1); 
-- Convert Into Varchar2 
Select Utl_Raw.Cast_To_Varchar2(Utl_Encode.Base64_Encode(L_Hash_Value_Raw)) 
Into Lv_Hash_Value_Varchar 
From Dual; 
    Lv_Hash_Value_Varchar := Substr(Lv_Hash_Value_Varchar,0,P_Length); 
Return Lv_Hash_Value_Varchar; 
End; 

Oracleのinvokation:

select SHA1('123', 8) from dual; -- Result: "QLOAFWMI" 

多分私の一般的な質問は、Oracle(PL/SQL)と.Netの暗号化/ raw/hexレベルの違いは何ですか?私は答えがこの特定の問題を解決するだろうと思う。

+0

ちょうどあなたが知っている、encyptionとハッシングの違いがあります。 SHA1は*ハッシング*アルゴリズムです。 –

+0

LordCover、問題をもう一度見てみる前に、アレクシーの答えを試すことができますか? –

+0

さて、あなたは今日、3回目のハッシュ関数を使ってパスワードをハッシュした第三者です。それをしないでください。そして、なぜあなたはdbサーバー上でパスワードハッシングを行うのですか? – CodesInChaos

答えて

4

誤ったエンコードを使用しています。次のコードを試してください:

string salt = "123"; 
System.Security.Cryptography.SHA1 sha = System.Security.Cryptography.SHA1.Create(); 
byte[] preHash = System.Text.Encoding.UTF8.GetBytes(salt); 
byte[] hash = sha.ComputeHash(preHash); 

string password = System.Convert.ToBase64String(hash); 
password = password.Substring(0, 8); 
+0

これを試してみましたが、C#で 'Encoding.UTF8.GetBytes'、そして' UTL_I18N.STRING_TO_RAW(string、 'AL32UTF8');でOracleの結果は以前と異なりますが、依然として違いはありません。 (C#の前、Oracleの前、C#の後、Oracleの後)は他のものと一致します。 –

+1

SQLコードを変更する必要はありません。私のC#コードとSQ​​Lコードを使用すると結果は同じです。彼らは "QLOAFWMI"を返す – azhohov

+0

ありがとう、それは働いたが、出力パスワードの第3文字は両方のアルゴリズムで '0'ではない 'O'です。 –

関連する問題