我正在使用Oracle数据库11g Express Edition在PL / SQL中进行REST API授权。我为每个程序都有api_key,nonce和signature作为IN变量。
Signature是一个HMAC-SHA256编码的字符串,其中包含存储在我的数据库中的api_secret。我想检查签名是否与数据库中的api_secret匹配。
我的问题是如何使用pl / sql在HMAC-SHA256中编码字符串?
答案 0 :(得分:1)
Oracle 10g有SHA256 PL / SQL实现,CruiserX有11g。 从here。
在sqlplus中编译包和包体。
调用以下函数:
SQL>从dual;
中选择sha256.encrypt('测试消息')- 输出:3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728
SQL>从dual中选择sha256.encrypt_raw(' 74657374206D657373616765');
- 输出:3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728
答案 1 :(得分:1)
sha256.encrypt for Oracle 10g,11g对我在oracle XE中的HMAC-SHA256 API授权是巨大的帮助。
使用我的plsql_hmac-sha256 git project中的oracle 11g XE中具有hmac-sha256 API授权的我的版本的完整源代码。但是要执行HMAC键控,我们基本上需要存储一些基本信息,例如上次用户请求的随机数。当然,在我的情况下,还有一些用于散列的函数(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;
感谢您的帮助。也许有人会觉得这很有用:)