sql—oracle相当于c#hmacsha256

u3r8eeie  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(609)

我正在尝试将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相媲美,或者我只是做错了什么?
谢谢!

oyjwcjzk

oyjwcjzk1#

所以基本上字符串和键字节都匹配。。。
不。
c#和oracle输出中的字符串字节不匹配。
如果将它们转换回ascii字符串,则会得到以下结果:

Oracle: 746ff487-3743-4343-a281-1ca88e93603bPOSThttps%3A%2F%2Fpreproddatahub.accessacloud.com%2Fapplication-api%2Fv2%2Finstances15944202089b74e5537e904872ad3f3411796711e9BKpTcG3NcMTdLWxWg+UgYg==
C#:     746ff487-3743-4343-a281-1ca88e93603bPOSThttps%3a%2f%2fpreproddatahub.accessacloud.com%2fapplication-api%2fv2%2finstances15944202089b74e5537e904872ad3f3411796711e9BKpTcG3NcMTdLWxWg+UgYg==
Diff:   -----------------------------------------------^--^--^---------------------------------^-----------------^----^

这两个字符串中有六个字符的编码不同:oracle字符串使用大写字母,c#字符串使用小写字母。
修复这六个差异,c#和oracle代码将返回相同的哈希值。

相关问题