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

C# 在C.Net和Oracle之间获得不同的加密结果,c#,oracle,character-encoding,cryptography,hash,C#,Oracle,Character Encoding,Cryptography,Hash,我想在C.Net和Oracle10G中对一些基于SHA1算法的字符串进行加密 我在C.Net中的算法: 在Oracle中: 创建或替换函数Sha1P_值Varchar2,P_长度数返回Varchar2 是 P_字符串Varchar22000:=P_值; L_Hash_Value_Raw 100; Lv_Hash_Value_Varchar Varchar2 40; 开始 L_Hash_Value_Raw:=Dbms_Crypto.Hash Src=>Utl_Raw.Cast_To_RawP_St

我想在C.Net和Oracle10G中对一些基于SHA1算法的字符串进行加密

我在C.Net中的算法:

在Oracle中:

创建或替换函数Sha1P_值Varchar2,P_长度数返回Varchar2 是 P_字符串Varchar22000:=P_值; L_Hash_Value_Raw 100; Lv_Hash_Value_Varchar Varchar2 40; 开始 L_Hash_Value_Raw:=Dbms_Crypto.Hash Src=>Utl_Raw.Cast_To_RawP_String, Typ=>Dbms\u Crypto.Hash\u Sh1; -转换为Varchar2 选择Utl_Raw.Cast_To_Varchar2Utl_Encode.Base64_EncodeL_Hash_Value_Raw 进入Lv\u Hash\u Value\u Varchar 来自双重; Lv_Hash_Value_Varchar:=SubstrLv_Hash_Value_Varchar,0,P_长度; 返回Lv_Hash_Value_Varchar; 终止 Oracle的调用:


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

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

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

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

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

正如你所知,加密和散列是有区别的。SHA1是一种散列算法。LordCover,在我们再次研究这个问题之前,你能试试Alexey的答案吗?该死,你是今天第三个用单次迭代散列函数散列密码的人。不要那样做。你为什么要在db服务器上进行密码哈希?@CodeInChaos我的密钥是DateTime。今天,我的salt对于每个客户端都是不同的,每个客户端都有一个唯一的值,“因此,通过一次迭代对密码进行散列是没有问题的,因为他们不知道我们首先要加密的是什么。”owlstead回答了Alexey的回答。正如你所知,加密和散列是有区别的。SHA1是一种散列算法。LordCover,在我们再次研究这个问题之前,你能试试Alexey的答案吗?该死,你是今天第三个用单次迭代散列函数散列密码的人。不要那样做。你为什么要在db服务器上进行密码散列?@CodeInChaos我的密钥是DateTime。今天,我的salt对于每个客户机都是不同的,每个客户机的唯一值都是不同的,所以用一次迭代散列密码是没有问题的,因为他们不知道我们首先要加密什么。@owlstead回答了Alexey的答案。我试过这个,C中的Encoding.UTF8.GetBytes和UTL_I18N.STRING_TO_原始字符串'AL32UTF8';在Oracle中,结果与之前不同,但仍然彼此不同,并且C before、Oracle before、C after和Oracle after这4个结果都不匹配任何其他结果。您不需要更改sql代码。如果使用我的C代码和sql代码,结果是相同的。它们返回QLOAFWMIThanks,但在两种算法中,输出密码的第三个字母都是0而不是O;在Oracle中,结果与之前不同,但仍然彼此不同,并且C before、Oracle before、C after和Oracle after这4个结果都不匹配任何其他结果。您不需要更改sql代码。如果使用我的C代码和sql代码,结果是相同的。它们返回QLOAFWMIThanks,虽然有效,但在两种算法中,输出密码的第三个字母都是0而不是O。
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);