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

Oracle 如何使用pl/sql对HMAC-SHA256中的字符串进行编码?,oracle,plsql,sha256,Oracle,Plsql,Sha256,我正在使用Oracle database 11g Express Edition在PL/SQL中进行REST API授权。我有api_密钥、nonce和签名作为每个过程的变量 签名是一个HMAC-SHA256编码字符串,包含存储在我的数据库中的api_机密。我想检查签名是否与数据库中的api_机密匹配 我的问题是如何使用pl/sql对HMAC-SHA256中的字符串进行编码 CruiserX为Oracle 10g和11g提供了SHA256 PL/SQL实现。 从下载包 在sqlplus中编译包和

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

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

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

CruiserX为Oracle 10g和11g提供了SHA256 PL/SQL实现。 从下载包

在sqlplus中编译包和包体

调用如下函数:

SQL>选择sha256。从双通道加密“测试消息”

-输出:3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728

SQL>选择sha256。加密来自dual的原始“74657374206D65733616765”

-输出:3f0a377ba0a4a460ecb616f6507ce0d8cfa3e704025d4fda3ed0c5ca05468728


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

我的版本的完整源代码,带有oracle 11g XE中的hmac-sha256 API授权,您可以在我的。但要执行HMAC键控,我们基本上需要存储一些基本信息,如上次用户请求的nonce。当然还有一些散列函数,在我的例子中是oracle11gxe。但在较新版本中,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;

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

在11g dbms中,加密只支持HMAC-SHA1;在12c中,它还支持HMAC-SHA256。您可能可以创建一个Java存储过程来进行检查,但是a我不知道您是否可以在XE中使用这些存储过程,b我不知道您需要哪一个版本的Java,如果您可以在11g中这样做的话。。。这没有多大帮助,但可能会给你一些东西来寻找。这不会执行HMAC键控