1

我实际上正在开发一个基于 netsuite 产品的新项目。我正在尝试使用 hmac sha256 加密消息。

考虑到我有 stringToEncrypt 和一个密钥,那么简单的方法是什么。

我已经阅读了 Netsuite 中的文档,但我仍然被卡住了......

有我的功能

function toHmacSHA256Base64(toCrypt, key) {
        var inputString = toCrypt;
        var myGuid = key;
        var sKey = crypto.createSecretKey({
            guid: myGuid,
            encoding: encode.Encoding.UTF_8
        });
        var hmacSHA256 = crypto.createHmac({
            algorithm: 'SHA256',
            key: sKey
        });
        hmacSHA256.update({
            input: inputString,
            inputEncoding: encode.Encoding.BASE_64
        });
        var digestSHA256 = hmacSHA256.digest({
            outputEncoding: encode.Encoding.HEX
        });
        return digestSHA256;
};

当然在这个词后面crypto我使用了模块'N/crypto'encode 'N/encode'. 多谢。

4

1 回答 1

4

这大致正确,看起来与 NS 帮助中的示例完全相同。如果你有一个字符串,那么你可能想要inputEncoding:encode.Encoding.UTF_8更新调用。

缺少的是如何生成密钥的 guid。为此,您使用套件。注意addSecretKeyField不是addCredentialFieldNS 帮助:

/**
 *@NApiVersion 2.x
 *@NScriptType Suitelet
 */
define(['N/ui/serverWidget', './config.js'],
    function(serverWidget, config) {
        function onRequest(context) {
            if (context.request.method === 'GET') {
                var form = serverWidget.createForm({
                    title: 'SFTP Password'
                });

                form.addSecretKeyField({
                    id : 'username',
                    label : 'Pwd',
                    restrictToScriptIds : config.targetScript,
                    restrictToCurrentUser : false
                });
                form.addSubmitButton({
                    label: 'Submit Button'
                });

                context.response.writePage(form);
            } else {
                var textField = context.request.parameters.username;
                context.response.write('You have entered: ' + textField);
            }
        }

        return {
            onRequest: onRequest
        };
    });

FWIW 加密在这里是错误的术语。您正在创建将用于确保数据完整性的数据哈希。您无法解密哈希。

生成密钥的 GUID 后,我只需将其存储在配置文件中(与上面脚本列表中使用的相同。

在 TypeScript 中它看起来像:

/**
 * config.js
 * @NApiVersion 2.x
 */

export var config =  {

    'host': '162.242.144.xxx',
    'userName': 'unsername',
    'targetScript': ['customscript_transmit_dsv_943', 'customscript_transmit_dsv_940', 'customscript_retrieve_dsv_944'],
    'hostKey': 'AAAAB3Nza...Wz'
};

然后除了 config.xs 文件之外的所有内容都可以存储在版本控制中。需要在脚本中使用的文件上适当地设置受众。

于 2017-10-05T19:46:30.793 回答