2012-05-06 4 views
1

C# .Net과 Oracle 10g의 SHA1 알고리즘을 기반으로 일부 문자열을 암호화하려고합니다.C# .Net과 Oracle간에 다른 암호화 결과 얻기

C# 닷넷에서 내 알고리즘 : 오라클에서

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; 

오라클의 invokation :

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

내 일반적인 질문은 오라클 (PL/SQL)과 .Net의 암호화/원시/16 진수 수준의 차이점은 무엇입니까? 그 대답은이 특정한 문제를 해결할 것이라고 생각합니다.

+0

잘 알고 있듯이, encyption과 hashing 사이에는 차이점이 있습니다. SHA1은 * 해싱 * 알고리즘입니다. –

+0

LordCover, 문제를 다시 살펴보기 전에 Alexey의 대답을 시도해 볼 수 있습니까? –

+0

젠장, 당신은 오늘 세 번째 사람입니다. 해시 암호는 단일 반복 해시 함수를 사용합니다. 그러지 마. 왜 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');는 오라클의 경우 결과가 이전과 다르지만 여전히 다르며 결과가 4 개가 아닙니다 (C# 이전, Oracle 이전, C# 이후, Oracle 이후)는 다른 것과 일치합니다. –

+1

당신은 SQL 코드를 변경할 필요가 없습니다. 내 C# 코드와 SQL 코드를 사용하면 결과가 동일합니다. 그들은 "QLOAFWMI"를 반환합니다. – azhohov

+0

감사합니다. 작동했지만 출력 암호 세 번째 문자는 두 알고리즘 모두에서 'O'가 아닌 '0'입니다. –