我已经编写了一个扩展程序来生成自定义身份验证字符串(让它实际工作会显着提高我们团队的效果)。
问题:我们的自定义身份验证字符串需要计算HMAC
,这也需要MD5
哈希。我尝试以Nodejs方式要求模块,但它不起作用。我注意到我需要的HMAC
和MD5
函数已经内置在应用程序中。
问题:有没有办法在自定义扩展中重复使用内置函数? - 拥有这种可能性将使整个过程变得更加容易。
如果上述情况不可行;我怎么能这样做:var crypto = require('crypto');
才能使用Nodejs'默认加密模块?
任何反馈意见都将受到高度赞赏。
答案 0 :(得分:1)
是的,这是一种从JavaScript代码创建和计算动态值的方法,但它还没有记录。以下是您需要使用动态值实现的两个功能:
function hmac(key, input){
return DynamicValue('com.luckymarmot.HMACDynamicValue', {
algorithm: 0, // for HMAC-MD5
input: input,
key: key
}).getEvaluatedString();
};
function md5(input){
return DynamicValue('com.luckymarmot.HashDynamicValue', {
hashType: 2, // for MD5
input: input
}).getEvaluatedString();
};
以及在自定义动态值中使用的示例:
function evaluate(context){
var a = md5("MyStringToHash");
var b = hmac("MyHMACKey", "String to sign");
return a + ':' + b;
};
答案 1 :(得分:1)
暂时,我设法解码base64
并将其重新编码为hex
,这不是最干净的方式,但是在提供额外功能之前,这可能会有所帮助有类似问题的人。可以调整AuthenticationHeaderDynamicValue
函数以执行您需要执行的操作。
(function() {
var request,
url,
md5 = function (input) {
return DynamicValue('com.luckymarmot.HashDynamicValue', {
hashType: 2,
input: input
}).getEvaluatedString();
},
hmac = function (key, input) {
return DynamicValue('com.luckymarmot.HMACDynamicValue', {
algorithm: 3,
input: input,
key: key
}).getEvaluatedString();
},
base64Decode = function (input) {
var a,
b = 0,
c,
e = {},
loop = 0,
result = '';
for (var i = 0; i < 64; i++) {
e['ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.charAt(i)] = i;
}
for (var x = 0; x < input.length; x++) {
c = e[input.charAt(x)];
b = (b << 6) + c;
loop += 6;
while (loop >= 8) {
(( a = (b >>> (loop -= 8)) &0xff ) || ( x < (input.length - 2))) && ( result += String.fromCharCode(a));
}
}
return result;
},
recode = function (input) {
var decodedString = base64Decode(input),
recodedString = '';
// Encode binary to hex
for (var i = 0; i < decodedString.length; i++) {
var hex = decodedString.charCodeAt(i).toString(16);
recodedString += ('000' + hex).slice(-2);
}
return recodedString;
},
AuthenticationHeaderDynamicValue = function () {
this.computeString = function (context) {
request = context.getCurrentRequest();
url = request.getUrl(true).components[1];
var time = Math.round(+new Date() / 1000),
md5Checksum = md5(request.jsonBody ? JSON.stringify(request.jsonBody) : url),
signature = hmac(this.secretKey, md5Checksum);
return recode(signature);
};
this.evaluate = function(context) {
if (this.secretKey) {
return this.computeString(context);
}
};
this.title = function() {
return "Authentication header";
};
this.text = function() {
return;
};
};
AuthenticationHeaderDynamicValue.identifier = "com.test.PawExtensions.AuthenticationHeaderDynamicValue";
AuthenticationHeaderDynamicValue.title = "AuthenticationHeader";
AuthenticationHeaderDynamicValue.inputs = [
DynamicValueInput("publicKey", "Public key", "String"),
DynamicValueInput("secretKey", "Secret key", "String")
];
registerDynamicValueClass(AuthenticationHeaderDynamicValue);
}).call(this);