如何使用 pl/sql 对 HMAC-SHA256 中的字符串进行编码?

问题描述 投票:0回答:3

我正在使用 Oracle 数据库 11g Express Edition 在 PL/SQL 中进行 REST API 授权。我有 api_key、nonce 和签名作为每个过程的 IN 变量。

Signature 是一个 HMAC-SHA256 编码的字符串,其中包含存储在我的数据库中的 api_secret。我想检查签名是否与数据库中的 api_secret 匹配。

我的问题是如何使用 pl/sql 对 HMAC-SHA256 中的字符串进行编码?

oracle-database plsql sha256
3个回答
1
投票
  1. CruiserX 有针对 Oracle 10g、11g 的 SHA256 PL/SQL 实现。 从这里下载软件包。

  2. 在sqlplus中编译包和包体。

  3. 像这样调用函数:

    SQL> select sha256.encrypt('测试消息') from Dual;

    --输出:3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728

    SQL> select sha256.encrypt_raw('74657374206D657373616765') from Dual;

    --输出:3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728


1
投票

CruiserX 的 Oracle 10g、11g 的 sha256.encrypt 对我在 oracle XE 中的 HMAC-SHA256 API 授权有很大帮助。

我的版本在 oracle 11g XE 中具有 hmac-sha256 API 授权的完整源代码,您可以在我的 plsql_hmac-sha256 git 项目中找到。 但要执行 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;

感谢您的帮助。也许有人会发现这很有用:)


0
投票

LOWER(RAWHEX(DBMS_CRYPTO.HASH(l_blob, DBMS_CRYPTO.HASH_SH256)));

© www.soinside.com 2019 - 2024. All rights reserved.