1

我想在 C#.Net 和 Oracle 10g 中基于 SHA1 算法加密一些字符串。

我在 C#.Net 中的算法:

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 的调用:

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

也许我的一般问题是 Oracle (PL/SQL) 和 .Net 在加密/原始/十六进制级别方面有什么区别?我想这个答案会解决这个特定的问题。

4

1 回答 1

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);
于 2012-05-06T10:12:53.710 回答