Oracle PLSQL 中的 SHA512 哈希与 Node.js
SHA512 hash in Oracle PLSQL vs Node.js
我需要使用加密模块在 Ora PL-SQL 中获取与 Node.js 中相同的哈希值。
在 PLSQL 中,我使用集成的 dbms_crypto.hash 函数。还有 dbms_crypto.mac 函数,但我不能使用它,因为没有额外的秘密可用于散列。
我尝试过的所有 3 种方法都从 Node 加密模块返回了不同的结果。
declare
v_body varchar2(1000):= 'myteststring';
v_hash varchar2(1000);
begin
--1 method
SELECT sys.dbms_crypto.hash( utl_raw.cast_to_raw(v_body), DBMS_CRYPTO.HASH_SH512 )
INTO v_hash
FROM dual;
dbms_output.put_line(lower((v_hash)));
--result:516e7933c5ecd0721cd91cdbe341834ffe775bb32a223faa5c564d3ddf0b3069bdebfde2f07b642bad5f1351ec913247c737855ba8adf03cb56adc76ca3c8722
--2 method
SELECT standard_hash (utl_raw.cast_to_raw(v_body), 'SHA512')
INTO v_hash
FROM dual;
dbms_output.put_line(lower(v_hash));
--result:516e7933c5ecd0721cd91cdbe341834ffe775bb32a223faa5c564d3ddf0b3069bdebfde2f07b642bad5f1351ec913247c737855ba8adf03cb56adc76ca3c8722
--3 method
SELECT standard_hash (rawtohex(v_body), 'SHA512')
INTO v_hash
FROM dual;
dbms_output.put_line(lower((v_hash)));
--result:7dcaa1fd7e41a572158ec8a3742599f9e34ddd33d649e1952223780863ee66a6722ad93091cc6e42f53e16f896e130ac4e28794affde34819e32e77873c2ed46
end;
在 Node.js 中,代码很简单,看起来像这样(这是另一面,无法更改):
const crypto = require('crypto');
var mystring = 'myteststring';
var hash = crypto.createHmac('sha512',mystring).digest('hex');
console.log(hash);
//22e6584b717cff0f6180bf988c5ebf0bbb0bc1959bbb911a203f9188971fc2de93b6c83465501747d1cde6f6efaf0b37d4ac278bcd3bb6fe662d3e9f7e0ae50c
我不确定我做错了什么,或者这个 Ora 函数的工作方式不同。我也尝试过更改参数类型 (clob/varchar)。 Ora 结果是十六进制的,就像它在 Node.js 中一样。
提前致谢!
在 Node.js 中,您使用的是 createHmac
而不是 createHash
。
如果您使用:
const crypto = require('crypto');
var mystring = 'myteststring';
var hash = crypto.createHash('sha512').update(mystring).digest('hex');
console.log(hash);
则输出为:
516e7933c5ecd0721cd91cdbe341834ffe775bb32a223faa5c564d3ddf0b3069bdebfde2f07b642bad5f1351ec913247c737855ba8adf03cb56adc76ca3c8722
这与您的前两个 Oracle 查询的输出相匹配。
如果您想生成 HMAC,那么在 Node.js 中您需要:
const crypto = require('crypto');
var mystring = 'myteststring';
var secret = 'mysecret';
var hash = crypto.createHmac('sha512', secret).update(mystring).digest('hex');
console.log(hash);
在 Oracle 中,您需要(未测试):
DECLARE
v_body varchar2(1000):= 'myteststring';
v_key varchar2(1000):= 'mysecret';
v_hash varchar2(1000);
BEGIN
SELECT DBMS_CRYPTO.MAC(
src => utl_raw.cast_to_raw(v_body),
typ => DBMS_CRYPTO.HMAC_SH512,
key => utl_raw.cast_to_raw(v_key)
)
INTO v_hash
FROM DUAL;
dbms_output.put_line(lower((v_hash)));
END;
/
对于您的代码,您需要一个 NULL
消息(同样,未经测试):
DECLARE
v_body varchar2(1000):= NULL;
v_key varchar2(1000):= 'myteststring';
v_hash varchar2(1000);
BEGIN
SELECT DBMS_CRYPTO.MAC(
src => utl_raw.cast_to_raw(v_body),
typ => DBMS_CRYPTO.HMAC_SH512,
key => utl_raw.cast_to_raw(v_key)
)
INTO v_hash
FROM DUAL;
dbms_output.put_line(lower((v_hash)));
END;
/
如果调用 dbms_crypto.mac 的 CLOB(或 BLOB)重载并传递一个空的 clob(或 blob),例如
,似乎可以工作
BEGIN
dbms_output.put_line (
dbms_crypto.mac (
src => EMPTY_CLOB (),
typ => dbms_crypto.hmac_sh512,
key => utl_raw.cast_to_raw ('myteststring')));
END;
/
22E6584B717CFF0F6180BF988C5EBF0BBB0BC1959BBB911A203F9188971FC2DE93B6C83465501747D1CDE6F6EFAF0B37D4AC278BCD3BB6FE662D3E9F7E0AE50C
我需要使用加密模块在 Ora PL-SQL 中获取与 Node.js 中相同的哈希值。 在 PLSQL 中,我使用集成的 dbms_crypto.hash 函数。还有 dbms_crypto.mac 函数,但我不能使用它,因为没有额外的秘密可用于散列。
我尝试过的所有 3 种方法都从 Node 加密模块返回了不同的结果。
declare
v_body varchar2(1000):= 'myteststring';
v_hash varchar2(1000);
begin
--1 method
SELECT sys.dbms_crypto.hash( utl_raw.cast_to_raw(v_body), DBMS_CRYPTO.HASH_SH512 )
INTO v_hash
FROM dual;
dbms_output.put_line(lower((v_hash)));
--result:516e7933c5ecd0721cd91cdbe341834ffe775bb32a223faa5c564d3ddf0b3069bdebfde2f07b642bad5f1351ec913247c737855ba8adf03cb56adc76ca3c8722
--2 method
SELECT standard_hash (utl_raw.cast_to_raw(v_body), 'SHA512')
INTO v_hash
FROM dual;
dbms_output.put_line(lower(v_hash));
--result:516e7933c5ecd0721cd91cdbe341834ffe775bb32a223faa5c564d3ddf0b3069bdebfde2f07b642bad5f1351ec913247c737855ba8adf03cb56adc76ca3c8722
--3 method
SELECT standard_hash (rawtohex(v_body), 'SHA512')
INTO v_hash
FROM dual;
dbms_output.put_line(lower((v_hash)));
--result:7dcaa1fd7e41a572158ec8a3742599f9e34ddd33d649e1952223780863ee66a6722ad93091cc6e42f53e16f896e130ac4e28794affde34819e32e77873c2ed46
end;
在 Node.js 中,代码很简单,看起来像这样(这是另一面,无法更改):
const crypto = require('crypto');
var mystring = 'myteststring';
var hash = crypto.createHmac('sha512',mystring).digest('hex');
console.log(hash);
//22e6584b717cff0f6180bf988c5ebf0bbb0bc1959bbb911a203f9188971fc2de93b6c83465501747d1cde6f6efaf0b37d4ac278bcd3bb6fe662d3e9f7e0ae50c
我不确定我做错了什么,或者这个 Ora 函数的工作方式不同。我也尝试过更改参数类型 (clob/varchar)。 Ora 结果是十六进制的,就像它在 Node.js 中一样。 提前致谢!
在 Node.js 中,您使用的是 createHmac
而不是 createHash
。
如果您使用:
const crypto = require('crypto');
var mystring = 'myteststring';
var hash = crypto.createHash('sha512').update(mystring).digest('hex');
console.log(hash);
则输出为:
516e7933c5ecd0721cd91cdbe341834ffe775bb32a223faa5c564d3ddf0b3069bdebfde2f07b642bad5f1351ec913247c737855ba8adf03cb56adc76ca3c8722
这与您的前两个 Oracle 查询的输出相匹配。
如果您想生成 HMAC,那么在 Node.js 中您需要:
const crypto = require('crypto');
var mystring = 'myteststring';
var secret = 'mysecret';
var hash = crypto.createHmac('sha512', secret).update(mystring).digest('hex');
console.log(hash);
在 Oracle 中,您需要(未测试):
DECLARE
v_body varchar2(1000):= 'myteststring';
v_key varchar2(1000):= 'mysecret';
v_hash varchar2(1000);
BEGIN
SELECT DBMS_CRYPTO.MAC(
src => utl_raw.cast_to_raw(v_body),
typ => DBMS_CRYPTO.HMAC_SH512,
key => utl_raw.cast_to_raw(v_key)
)
INTO v_hash
FROM DUAL;
dbms_output.put_line(lower((v_hash)));
END;
/
对于您的代码,您需要一个 NULL
消息(同样,未经测试):
DECLARE
v_body varchar2(1000):= NULL;
v_key varchar2(1000):= 'myteststring';
v_hash varchar2(1000);
BEGIN
SELECT DBMS_CRYPTO.MAC(
src => utl_raw.cast_to_raw(v_body),
typ => DBMS_CRYPTO.HMAC_SH512,
key => utl_raw.cast_to_raw(v_key)
)
INTO v_hash
FROM DUAL;
dbms_output.put_line(lower((v_hash)));
END;
/
如果调用 dbms_crypto.mac 的 CLOB(或 BLOB)重载并传递一个空的 clob(或 blob),例如
,似乎可以工作BEGIN
dbms_output.put_line (
dbms_crypto.mac (
src => EMPTY_CLOB (),
typ => dbms_crypto.hmac_sh512,
key => utl_raw.cast_to_raw ('myteststring')));
END;
/
22E6584B717CFF0F6180BF988C5EBF0BBB0BC1959BBB911A203F9188971FC2DE93B6C83465501747D1CDE6F6EFAF0B37D4AC278BCD3BB6FE662D3E9F7E0AE50C