dbms_crypto输出与crypto-js

时间:2018-03-22 15:13:51

标签: plsql cryptojs hmacsha1 dbms-crypto

我正在使用Cerner的专有语言CCL创建一个hmac-sha1哈希。它与PL / SQL类似,可以访问本机oracle函数。这个想法是模仿在javascript中创建的哈希。 Oracle正在使用DBMS_CRYPTO,而javascript正在使用CRYPTO.JS。下面是我的两个实现,但是我无法使哈希与基本测试字符串匹配。

如果有人能说清楚我做错了什么,我会很感激!我已经尝试过如何将数据提供给dbms_crypto.mac()函数,但我无法使其匹配。

Javascript输出:bad02f0a5324ad708bb8100220bae499e2c127b8

Codepen:https://codepen.io/bookluvr416/pen/jzmVWx

var consumerKey = "testConsumer";  
var secretKey = "testSecret";  
var valueToSign = consumerKey + secretKey;  
var hmac = Crypto.HMAC(Crypto.SHA1, valueToSign.toLowerCase(), 
secretKey.toLowerCase(), { asBytes: false });  

DBMS_CRYPTO输出:0BCC191B3A941C95ECAA46C8F825394706096E62

PL / SQL我尝试以CCL为基础的示例:

DECLARE
    typ       INTEGER := DBMS_CRYPTO.SH1;
    key       RAW(100) := 'testsecret';
    mac_value RAW(100);
BEGIN

mac_value := DBMS_CRYPTO.MAC('testconsumertestsecret', typ, key);

END;

警告 - 我无法真正测试PL / SQL版本,因为我没有可以使用oracle沙箱。我也不允许发布专有代码外部网站,所以我无法显示我的实际实现。

2 个答案:

答案 0 :(得分:1)

我使用的是不正确或过时的例子。

DBMS_CRYPTO.mac(UTL_I18N.string_to_raw(l_oauth_base_string, 'AL32UTF8') 
           ,DBMS_CRYPTO.hmac_sh1 
           ,UTL_I18N.string_to_raw(l_oauth_key, 'AL32UTF8'));

答案 1 :(得分:0)

一旦JavaScript中的cryptoJS与Oracle PL / SQL中的dbms_crypto之间不存在兼容性,尤其是在使用Pkcs7进行加密时,以下代码说明了如何实现。 答案在这里:

JavaScript

var AesUtil = function() {};
 
AesUtil.prototype.encrypt = function(key, iv, plainText) {
 
  var encrypted = CryptoJS.AES.encrypt(
      plainText,
      CryptoJS.enc.Base64.parse(key),
      { iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}
 
AesUtil.prototype.decrypt = function(key, iv, cipherText) {
  var cipherParams = CryptoJS.lib.CipherParams.create({
    ciphertext: CryptoJS.enc.Base64.parse(cipherText)
  });
  var decrypted = CryptoJS.AES.decrypt(
      cipherParams,
      CryptoJS.enc.Base64.parse(key),
      { iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
  return decrypted.toString(CryptoJS.enc.Utf8);
}

PL / SQL

create or replace package encrypt_decrypt_pk as 
-- Created by Abdullah Zabarah 19/09/2020
-- grant execute on sys.dbms_crypto to <Your Schema>; -- Using sysdba

function fn_encrypt(a_text in varchar2, a_key varchar2, a_iv varchar2) return varchar2;
 
function fn_decrypt(a_token in varchar2, a_key varchar2, a_iv varchar2) return varchar2;


end encrypt_decrypt_pk;
/

create or replace package body encrypt_decrypt_pk as   
-- Created by Abdullah Zabarah 19/09/2020
-- grant execute on sys.dbms_crypto to <Your Schema>; -- Using sysdba



function fn_encrypt(a_text in varchar2, a_key varchar2, a_iv varchar2)
return varchar2
as
    encryption_type    pls_integer :=
                            dbms_crypto.encrypt_aes128
                          + dbms_crypto.chain_cbc
                          + dbms_crypto.pad_pkcs5;
begin
    return utl_raw.cast_to_varchar2(utl_encode.base64_encode(dbms_crypto.encrypt(
         src => utl_raw.cast_to_raw(a_text),
         typ => encryption_type,
         key => utl_encode.base64_decode(utl_raw.cast_to_raw(a_key)),
         iv  => utl_raw.cast_to_raw(a_iv)
    )));
end;
 
function fn_decrypt(a_token in varchar2, a_key varchar2, a_iv varchar2)
return varchar2
as   
    encryption_type    pls_integer :=
                            dbms_crypto.encrypt_aes128
                          + dbms_crypto.chain_cbc
                          + dbms_crypto.pad_pkcs5;
begin
       
                
    return utl_raw.cast_to_varchar2(dbms_crypto.decrypt(
        src => utl_encode.base64_decode(utl_raw.cast_to_raw(a_token)),
        typ => encryption_type,
        key => utl_encode.base64_decode(utl_raw.cast_to_raw(a_key)),
        iv  => utl_raw.cast_to_raw(a_iv)
    ));
end;

end encrypt_decrypt_pk;
/