1

我编写了一个扩展来生成自定义身份验证字符串(让它实际工作将显着提高我们团队的绩效)。

问题:我们的自定义身份验证字符串需要HMAC计算一个,这也需要一个MD5哈希值。我尝试以 Nodejs 方式要求模块,但它不起作用。我注意到我需要的HMACMD5函数已经内置在应用程序中。

问题:有没有办法在自定义扩展中重用内置函数?- 拥有这种可能性将使整个过程变得容易得多。

如果以上不可行;我怎么能做这样的事情:var crypto = require('crypto');为了使用 Nodejs 的默认加密模块?

任何反馈将不胜感激。

4

2 回答 2

1

是的,有一种方法可以从 JavaScript 代码创建和计算动态值,但还没有文档记录。以下是您需要使用动态值实现的 2 个函数:

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;
};
于 2015-11-07T22:51:11.810 回答
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);
于 2015-11-19T01:15:29.940 回答