【问题标题】:SuiteScript hmac sha256SuiteScript hmac sha256
【发布时间】:2018-03-13 00:10:56
【问题描述】:

我实际上正在开发一个基于 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'。 非常感谢。

【问题讨论】:

    标签: netsuite suitescript suitescript2.0


    【解决方案1】:

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

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

    /**
     *@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 文件之外的所有内容都可以存储在版本控制中。需要在脚本中使用的文件上适当地设置受众。

    【讨论】:

    • 我正在尝试在 RESTlet 中计算 HMAC,但不涉及任何形式。我正在尝试调用外部 Web 服务,而该 Web 服务要求我发送 HMAC。我看不到在不涉及表单的情况下创建 secretKey 的方法。在那儿?我想我将不得不从 crypto-js 导入例程来做这个简单的事情。
    • 该表单仅用于获取 hmac 密钥的密钥库引用。不过,我已经为 ss1 和 ss2 使用了外部库路线,这也有效
    • 你是说这个方法在 Netsuite 中永久存储一个秘密,然后你可以使用返回的 GUID 来引用它?这些秘密在管理 UI 的任何地方都可见吗?我搜索了文档和 Netsuite,但找不到明显的位置来存储用于外部身份验证等用例的机密。
    • 没错。返回的 GUID 是对已上传密钥的引用。您将 GUID 传递给您希望传递密钥的 Netsuite API。
    • 这些机密存储在 Netsuite 中后,您如何管理它们?您是否需要在 Netsuite 之外的某个地方维护一个电子表格来将您的 GUID 映射到其中包含的秘密?
    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2012-07-10
    • 2021-08-17
    相关资源
    最近更新 更多