我正在尝试将c#功能移植到oracle,但hmacsha256出现问题:
Oracle
function HMACSha256(key in varchar2 default null, str in varchar2) return varchar2 is
l_encryption_object cp_encrypt.encryption_object;
l_hashValue raw(4000);
l_str_raw raw(4000) := utl_raw.cast_to_raw(str);
l_key_raw raw(4000) := utl_encode.base64_decode(utl_raw.cast_to_raw(key));
begin
--
dbms_output.put_line('Key Bytes: '|| l_key_raw);
dbms_output.put_line('String Bytes: '|| l_str_raw);
--
l_hashValue := dbms_crypto.mac(src => l_str_raw,
key => l_key_raw,
typ => dbms_crypto.HMAC_SH256);
--
dbms_output.put_line('Hash Bytes: '|| l_hashValue);
--
return utl_raw.cast_to_varchar2(utl_encode.base64_encode(l_hashValue));
end HMACSha256;
输出
密钥字节:186f3464cc4d32b6ac52ea0930fbffcea46c25d8f380e60e12ffe3deab7da2
字符串字节:373436663438372d333734332d34334333432d613238312d3163613838653333630362504f5346874747073253341253262534670726f646174616875622e61636365737361636c6f75642e6363636363636d2536174696f6e2d61706925362467253246696e7374616e63636363635334343230323038396237343533376938373261643363636331313363639424b70543346444c577857672b556759673d3d型
哈希字节:168248FA2030CFDAFDE1590BA740F51671E62410A80EA7C17963B0E3A4865A0
c级#
internal static string Sha256Hash(string key, string content)
{
var keyBytes = Convert.FromBase64String(key);
Console.WriteLine("Key Bytes:" + BitConverter.ToString(keyBytes));
var contentBytes = Encoding.ASCII.GetBytes(content);
Console.WriteLine("String Bytes:" + BitConverter.ToString(contentBytes));
using (var hmac = new HMACSHA256(keyBytes))
{
var signatureBytes = hmac.ComputeHash(contentBytes);
Console.WriteLine("Hash Bytes:" + BitConverter.ToString(signatureBytes));
return Convert.ToBase64String(signatureBytes);
}
}
输出
钥匙bytes:18-6f-34-64-cc-4d-32-b6-ac-52-ea-09-30-90-fb-ff-ce-a4-6c-25-d8-f3-80-e6-0e-12-ff-e3-de-ab-7d-a2
字符串bytes:37-34-36-66-66-34-38-37-2d-33-37-34-33-2d-34-33-34-33-2d-61-32-38-31-2d-31-63-61-38-38-65-39-33-36-30-33-62-50-4f-53-54-68-74-74-70-73-25-33-61-25-32-66-25-32-66-70-72-65-70-72-6f-64-64-61-74-61-68-75-62-2e-61-63-63-65-73-73-61-63-6c-6f-75-64-2e-63-6f-6d-25-32-66-61-70-70-6c-69-63-61-74-69-6f-6e-2d-61-70-69-25-32-66-76-32-25-32-66-69-6e-73-74-61-6e-63-65-73-31-35-39-34-34-32-30-30-38-39-62-37-34-65-35-33-37-65-39-30-34-38-37-32-61-64-33-66-33-34-31-37-39-36-37-31-65-39-42-4b-70-54-63-47-33-4e-63-4d-54-64-4c-57-78-67-2b-55-67-59-67-3d-3d
搞砸bytes:05-54-e0-a0-55-90-e9-03-de-60-b6-22-a3-52-81-ed-76-c0-6d-b7-02-f4-96-76-53-aa-1c-09-ad-22-2b-61
所以基本上字符串和键字节都匹配,但是当我运行hmacsha256散列时,它们返回不同的值。
有没有什么Oracle可以与c#hmacsha256相媲美,或者我只是做错了什么?
谢谢!
1条答案
按热度按时间oyjwcjzk1#
所以基本上字符串和键字节都匹配。。。
不。
c#和oracle输出中的字符串字节不匹配。
如果将它们转换回ascii字符串,则会得到以下结果:
这两个字符串中有六个字符的编码不同:oracle字符串使用大写字母,c#字符串使用小写字母。
修复这六个差异,c#和oracle代码将返回相同的哈希值。