我正在使用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沙箱。我也不允许发布专有代码外部网站,所以我无法显示我的实际实现。
答案 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;
/