如何使用 pl/sql 在 HMAC-SHA256 中编码字符串?
how can I encode string in HMAC-SHA256 using pl/sql?
我正在使用 Oracle 数据库 11g 快捷版在 PL/SQL 中进行 REST API 授权。我有 api_key、nonce 和签名作为每个过程的 IN 变量。
签名是一个包含 api_secret 的 HMAC-SHA256 编码字符串,存储在我的数据库中。我想检查数据库中的签名是否与我的 api_secret 匹配。
我的问题是如何使用 pl/sql 在 HMAC-SHA256 中对字符串进行编码?
CruiserX 为 Oracle 10g、11g 实施了 SHA256 PL/SQL。
从 here.
下载软件包
在sqlplus中编译包和包体
像这样调用函数:
SQL> select sha256.encrypt('test message') 来自 dual;
-- 输出:3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728
SQL> select sha256.encrypt_raw('74657374206D657373616765') 来自 dual;
-- 输出:3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728
sha256.encrypt for Oracle 10g,CruiserX 的 11g 对我在 oracle XE 中的 HMAC-SHA256 API 授权有很大帮助。
我的版本的完整源代码,在 oracle 11g XE 中具有 hmac-sha256 API 授权,您可以在我的 plsql_hmac-sha256 git project. But to perform HMAC keying we basically need store some basic information like nonce of last user request. And of course some function for hashing in my case (oracle 11gXE) sha256.encrypt 中找到。但是在较新的版本中,oracle 确实为 dbms_crypto.hash 函数提供了更好的内置选项。
PROCEDURE HMAC_AUTHORIZATION (i_api_key IN VARCHAR2, i_api_nonce IN NUMBER, i_api_sign IN VARCHAR, R OUT NUMBER)
IS
p_auth_id NUMBER(10);
p_api_sign_msg VARCHAR2(500);
p_api_nonce NUMBER(35);
p_api_sign VARCHAR2(500);
system_sign VARCHAR2(500);
BEGIN
SELECT AUTH_ID, API_NONCE INTO p_auth_id, p_api_nonce FROM USER_AUTH WHERE API_KEY = i_api_key AND AUTH_STATUS = 1 AND API_NONCE < i_api_nonce;
/* User signature */
p_api_sign_msg := p_auth_id || i_api_key || i_api_nonce;
p_api_sign := sha256.encrypt(p_api_sign_msg);
/* system signature */
system_sign := sha256.encrypt(p_auth_id || i_api_key || i_api_nonce);
IF p_api_sign = system_sign THEN
UPDATE USER_AUTH SET REQUESTS_COUNT = REQUESTS_COUNT+1, API_NONCE = i_api_nonce, LAST_REQUEST = SYSDATE WHERE API_KEY = i_api_key AND AUTH_STATUS = 1 AND AUTH_ID = p_auth_id;
commit;
R := 1;
ELSE
R := 0;
END IF;
EXCEPTION WHEN NO_DATA_FOUND THEN
R := 0;
WHEN OTHERS THEN
R := 0;
END HMAC_AUTHORIZATION;
感谢您的帮助。也许有人会发现这很有用 :)
我正在使用 Oracle 数据库 11g 快捷版在 PL/SQL 中进行 REST API 授权。我有 api_key、nonce 和签名作为每个过程的 IN 变量。
签名是一个包含 api_secret 的 HMAC-SHA256 编码字符串,存储在我的数据库中。我想检查数据库中的签名是否与我的 api_secret 匹配。
我的问题是如何使用 pl/sql 在 HMAC-SHA256 中对字符串进行编码?
CruiserX 为 Oracle 10g、11g 实施了 SHA256 PL/SQL。 从 here.
下载软件包
在sqlplus中编译包和包体
像这样调用函数:
SQL> select sha256.encrypt('test message') 来自 dual;
-- 输出:3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728
SQL> select sha256.encrypt_raw('74657374206D657373616765') 来自 dual;
-- 输出:3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728
sha256.encrypt for Oracle 10g,CruiserX 的 11g 对我在 oracle XE 中的 HMAC-SHA256 API 授权有很大帮助。
我的版本的完整源代码,在 oracle 11g XE 中具有 hmac-sha256 API 授权,您可以在我的 plsql_hmac-sha256 git project. But to perform HMAC keying we basically need store some basic information like nonce of last user request. And of course some function for hashing in my case (oracle 11gXE) sha256.encrypt 中找到。但是在较新的版本中,oracle 确实为 dbms_crypto.hash 函数提供了更好的内置选项。
PROCEDURE HMAC_AUTHORIZATION (i_api_key IN VARCHAR2, i_api_nonce IN NUMBER, i_api_sign IN VARCHAR, R OUT NUMBER)
IS
p_auth_id NUMBER(10);
p_api_sign_msg VARCHAR2(500);
p_api_nonce NUMBER(35);
p_api_sign VARCHAR2(500);
system_sign VARCHAR2(500);
BEGIN
SELECT AUTH_ID, API_NONCE INTO p_auth_id, p_api_nonce FROM USER_AUTH WHERE API_KEY = i_api_key AND AUTH_STATUS = 1 AND API_NONCE < i_api_nonce;
/* User signature */
p_api_sign_msg := p_auth_id || i_api_key || i_api_nonce;
p_api_sign := sha256.encrypt(p_api_sign_msg);
/* system signature */
system_sign := sha256.encrypt(p_auth_id || i_api_key || i_api_nonce);
IF p_api_sign = system_sign THEN
UPDATE USER_AUTH SET REQUESTS_COUNT = REQUESTS_COUNT+1, API_NONCE = i_api_nonce, LAST_REQUEST = SYSDATE WHERE API_KEY = i_api_key AND AUTH_STATUS = 1 AND AUTH_ID = p_auth_id;
commit;
R := 1;
ELSE
R := 0;
END IF;
EXCEPTION WHEN NO_DATA_FOUND THEN
R := 0;
WHEN OTHERS THEN
R := 0;
END HMAC_AUTHORIZATION;
感谢您的帮助。也许有人会发现这很有用 :)