在 C#.Net 和 Oracle 之间获取不同的加密结果

本文关键字:加密结果 获取 之间 Net Oracle | 更新日期: 2023-09-27 18:33:23

我想在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;

甲骨文的调用:

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

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

在 C#.Net 和 Oracle 之间获取不同的加密结果

您使用了错误的编码。 请尝试以下代码:

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);