使用 JavaScript 使用 HmacSHA256 正确签署字符串

2023-11-21

在用于身份验证的 Houndify API 文档中,您有以下内容块:


验证请求的示例

假设我们有以下信息:

UserID: ae06fcd3-6447-4356-afaa-813aa4f2ba41
    RequestID: 70aa7c25-c74f-48be-8ca8-cbf73627c05f
    Timestamp: 1418068667   
    ClientID: KFvH6Rpy3tUimL-pCUFpPg==
    ClientKey: KgMLuq-k1oCUv5bzTlKAJf_mGo0T07jTogbi6apcqLa114CCPH3rlK4c0RktY30xLEQ49MZ-C2bMyFOVQO4PyA==
  1. 按以下格式连接 UserID 字符串、RequestID 字符串和 TimeStamp 字符串:{user_id};{request_id}{timestamp}

  2. 使用示例中的值,在这种情况下的预期输出将是:ae06fcd3-6447-4356-afaa-813aa4f2ba41;70aa7c25-c74f-48be-8ca8-cbf73627c05f1418068667

  3. 使用解码后的 ClientKey 对消息进行签名。结果是一个 32 字节的二进制字符串(我们无法直观地表示)。然而,经过 Base-64 编码后,签名为:myWdEfHJ7AV8OP23v8pCH1PILL_gxH4uDOAXMi06akk=

  4. 然后客户端生成两个身份验证标头Hound-请求-身份验证 and Hound-客户端-身份验证.

  5. Hound-Request-Authentication 标头由 UserID 和 RequestID 按以下格式连接而成:{user-id};{request-id}。继续上面的示例,此标头的值将是: Hound-请求-身份验证:ae06fcd3-6447-4356-afaa-813aa4f2ba41;70aa7c25-c74f-48be-8ca8-cbf73627c05f

  6. Hound-Client-Authentication 标头由 ClientID、TimeStamp 字符串和签名组成,格式如下:{client-id};{timestamp};{signature}。继续上面的示例,此标头的值将是:Hound-Client-Authentication: KFvH6Rpy3tUimL-pCUFpPg==;1418068667;myWdEfHJ7AV8OP23v8pCH1PILL_gxH4uDOAXMi06akk=


对于第 3 项,它表示“使用解码后的 ClientKey 对消息进行签名”。 “message”和“ClientKey”是两个不同的字符串。

我的问题:如何用另一个字符串对一个字符串进行签名,即这到底是什么意思?你会如何在 JavaScript 中做到这一点?

var message = 'my_message';
var key = 'signing_key';

//??what next??

我试图弄清楚这一切,以便我可以在 Postman 中创建一个预请求脚本来执行正确的 HmacSHA256 哈希。


根据文档,如果您使用他们的 SDK 之一,它将自动验证您的请求:

SDK 已经为您处理身份验证。您只需提供 带有为您生成的客户端 ID 和客户端密钥的 SDK 客户端创建时。如果您没有使用 SDK,请使用代码 右侧的示例生成您自己的 HTTP 标头以进行身份​​验证 你的申请。

但是,如果您想手动执行此操作,我相信您需要计算HMAC他们在您的问题的链接中描述的字符串的值,然后将其以 Base64 编码作为Hound-Client-Authentication您的请求中的标头。他们提供了一个Node.js 的示例:

var uuid = require('node-uuid');
var crypto = require('crypto');

function generateAuthHeaders (clientId, clientKey, userId, requestId) {

    if (!clientId || !clientKey) {
        throw new Error('Must provide a Client ID and a Client Key');
    }

    // Generate a unique UserId and RequestId.
    userId      = userId || uuid.v1();

    // keep track of this requestId, you will need it for the RequestInfo Object
    requestId   = requestId || uuid.v1();

    var requestData = userId + ';' + requestId;

    // keep track of this timestamp, you will need it for the RequestInfo Object
    var timestamp   = Math.floor(Date.now() / 1000),  

        unescapeBase64Url = function (key) {
            return key.replace(/-/g, '+').replace(/_/g, '/');
        },

        escapeBase64Url = function (key) {
            return key.replace(/\+/g, '-').replace(/\//g, '_');
        },

        signKey = function (clientKey, message) {
            var key = new Buffer(unescapeBase64Url(clientKey), 'base64');
            var hash = crypto.createHmac('sha256', key).update(message).digest('base64');
            return escapeBase64Url(hash);

        },

        encodedData = signKey(clientKey, requestData + timestamp),
        headers = {
            'Hound-Request-Authentication': requestData,
            'Hound-Client-Authentication': clientId + ';' + timestamp + ';' + encodedData
        };

    return headers;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JavaScript 使用 HmacSHA256 正确签署字符串 的相关文章

  • 使用 parsley.js 支持每个字段多个自定义错误消息

    我正在尝试使用 parsley js 验证一个简单的表单 并且我对 parsley js 非常初学者 我想使用 window ParsleyValidator addValidator 方法在一个自定义验证方法中显示多个错误消息 所以我尝试
  • 在淘汰赛应用程序中使用 setInterval 进行轮询实现?

    我正在尝试使用 setInterval 实现简单的轮询机制 我有一个视图模型如下 define knockout jquery function ko function ViewModel var self this setInterval
  • 如果替换路径中的最后一个元素,React Router v6 useNavigate() 不会导航

    我有一个具有以下功能的反应组件 const handleNavigate clientId gt console log clientId navigate dashboard clients clientId console log 显示
  • 如何使用 JavaScript 将当前页面设置为 about:blank?

    我遇到的情况是服务器可能在当前地址上不可用 因此我想检测到这一点并将页面重定向到 about blank 页面 我该如何使用 JavaScript 来做到这一点 window location href about blank
  • 匹配数组中的对象并合并

    UPDATE 我有一个名为的对象数组cars包含 li 标签 其中包含有关汽车的属性数据 例如价格 汽车类型等 我的目标是 如果这些汽车符合某些标准 则将它们合并到一个列表中 要求 快速性能 保持相同的汽车数组结构 Main Goal Ma
  • 如何修复网站 iframe 错误?

    当我访问此网址时 警告 推荐使用一些广告拦截器 网页链接加载良好 没有错误 但是 当我尝试通过加载同一页面时iframe在我的html代码中 出现错误 我的html代码
  • 如何创建一个多重过滤函数来过滤掉多个属性?

    我有一个要过滤的对象数组 name Apple age 24 model Android status Under development name Roboto age 24 model Apple status Running 我需要使
  • React 不响应按键事件

    我正在尝试实现一些非常基本的按键检测 但我根本无法让它工作 我有一个裸露的组件 应该在onKeyDown事件 但控制台中没有任何内容被注销 class App extends React Component constructor prop
  • 根据用户区域设置过滤字符串列表

    当使用 AngularJS 1 6 处理 JavaScript 项目时 我有一个要过滤的字符串列表 例如 假设我的列表包含 rbol cig e a nido and tubo 当过滤西班牙语字符串时 如果我过滤 u 我会期望两者cig e
  • Ajax JSON 数据和灯箱冲突

    我有一个带有灯箱插件的画廊设置光廊 http sachinchoolur github io lightGallery docs 该画廊与静态 HTML 完美配合 当我动态抓取 API 数据并尝试让灯箱处理这些项目时 问题就出现了 我似乎无
  • mouseover 和 mouseout 事件在子进程上触发

    代码 div div div div 如果我将鼠标悬停在Navigation the Drop Downdiv 向下滑动 如果我将鼠标移开 它会向上滑动 问题是如果我将鼠标悬停在孩子上Drop Downdiv它也向上滑 动 有谁知道我该如何
  • 覆盖函数(例如“警报”)并调用原始函数?

    我想用调用原始版本的新版本覆盖 Javascript 内置函数 类似于用调用的版本覆盖类上的方法 super有多种语言版本 我怎样才能做到这一点 例如 window alert function str do something addit
  • 嵌套辅助函数和性能

    嵌套辅助函数对于使代码更易于理解非常有用 谷歌甚至建议在他们的应用程序中使用嵌套函数时尚指南 https google styleguide googlecode com svn trunk javascriptguide xml Nest
  • express 或express-generator:我需要两者吗?

    只是探索 Node js 并遇到了 Express 在 npm 存储库站点上https www npmjs com package express https www npmjs com package express它明确指出安装是 np
  • 当条件评估为 true 时获取元素(扩展 ElementArrayFinder)

    我们有一个菜单 表示为ul gt li列表 简化 ul class dropdown menu li class ng scope a href class ng binding Menu Item 1 a li li li ul
  • React + Semantic-UI:在 UI MODAL 中使用表单

    在没有 React 的普通旧 Semantic UI 中 我已经能够毫无问题地将表单放入 Modal 中 使用 Semantic UI React 版本 我能够在模态中显示表单 但它并没有按照我期望的方式工作 例如 模态框显示后 模态框内的
  • 水平平滑滚动 100px

    Heyjo problem 一周以来我一直在寻找 javascript 或 jQuery 代码 以便在我的网站上实现滚动按钮 我失败的那一刻是按钮应该多次工作的时候 他的任务不是滚动到专用元素 而是应该向左滚动 例如 100px 此外 滚动
  • D3v6 嵌套图 - 嵌套 join()?

    我想可视化每个节点的 孩子 洞察力 我猜 D3v6 join 函数可以嵌套 不幸的是我找不到任何例子 下面的代码片段包含一个具有 3 个节点和子节点作为属性的outerGraph 到目前为止 这些孩子还没有被使用 相反 innerGraph
  • Jquery 两个字段的时间差(以小时为单位)

    我的表单中有两个字段 用户可以在其中选择输入时间 start time end time 我想在更改这些字段时重新计算另一个字段的值 我想做的是获取两次之间的小时数 例如 如果我的开始时间为 5 30 结束时间为 7 50 我想将结果 2
  • 利用重力效果拖动元素

    我想完成类似于 photoshop com 和此网站的功能 http mrdoob com projects chromeexperiments google gravity http mrdoob com projects chromee

随机推荐

  • 如何知道 Firefox 中是否单击了刷新按钮或浏览器后退按钮? [复制]

    这个问题在这里已经有答案了 在 Firefox 中如何知道是否单击了刷新按钮或单击了浏览器后退按钮 对于这两个事件 onbeforeunload 方法是一个回调 对于 Internet Explorer 我的处理方式如下 function
  • ReactJS - FCM 无法在 safari 浏览器中工作[重复]

    这个问题在这里已经有答案了 我正在尝试在我的 ReactJS 应用程序中实现 FCM 推送通知 它在 chrome 和 firefox 浏览器中完美运行 但在 safari 浏览器中遇到问题 FirebaseError 消息传递 此浏览器不
  • 应用程序提供的字体列表 (iOS)

    有谁知道如何从 Xcode 中 info plist 文件中的 应用程序提供的字体 键获取自定义字体列表 谢谢 以下代码从 Info plist 中读取自定义字体文件列表 并从字体文件中提取完整的字体名称 部分代码复制自https stac
  • 在 .NET 应用程序中使用 ApacheFOP v1.0

    有人成功地将 Apache FOP v1 0 库编译为 NET DLL 吗 我正在使用位于以下位置的 IKVM 语法 http onjava com pub a onjava 2004 08 18 ikvm html 然而 编译后的DLL似
  • Karma 错误 - 未知提供商:$$asyncCallbackProvider

    尝试通过 grunt 运行我的业力测试 但出现错误 Error injector modulerr Failed to instantiate module ngMock due to Error injector unpr Unknown
  • 如何动态改变ImageView高度

    我有一个用于 ListView 单元格的简单线性布局 它有一个图像视图 图像将从互联网下载 因此尺寸可以不同 但是 我想将imageview的宽度设置为fill parent 这是固定的 并在运行时动态改变图像高度 设置图像高度的规则 如果
  • 在调用保存字符串 ID 之前,必须手动分配此类的 ID

    已经阅读了很多关于同一问题的问题 但我仍然无法解决这个问题 我需要有一个String我的数据库上的主键 import javax persistence Entity import javax persistence Id Entity p
  • 显示 system.data.datarowview 的组合框数据绑定

    我将组合框与数据源 显示成员 值成员绑定 它在我的电脑上运行良好 但在客户端电脑上无法运行 以下是我的源代码 cbxAlloyBinding 方法是从 UserControl 的构造函数中调用的 private void cbxAlloyB
  • 从 shell 脚本读取 python 脚本中带空格的参数

    运行 python 脚本时如何读取带空格的参数 UPDATE 看来我的问题是我通过 shell 脚本调用 python 脚本 这有效 gt python script py firstParam file with spaces txt o
  • 如何检测图像何时失焦?

    有时 我们的光学检测系统会失焦 导致测量结果无意义 我的任务是开发一个 失焦 探测器 用于驱动相机系统的 Z 轴 我可用的图像是 bmp 我正在寻找方法和算法来研究 例如 我应该隔离特征并测量一致性 还是可以使用边缘检测 This is t
  • '^' 在 C#(枚举)中起什么作用?

    我正在阅读一些第 3 方代码 发现了以下内容 x Flags x Flags Flags Hidden 它有什么作用 我使用了 和 对于带有枚举的按位 与 和 或 但这是我第一次看到该符号 是 C 中的按位异或运算符 编辑 如果 a 为真且
  • T-SQL CASE 子句:如何指定 WHEN NULL

    我写了一个类似这样的T SQL语句 原来的看起来不同 但我想在这里给出一个简单的例子 SELECT first name CASE last name WHEN null THEN Max ELSE Peter END AS Name FR
  • 调整 XORShift 生成器以返回最大值内的数字

    我需要生成最大范围内的随机整数 自从性能至关重要 我决定使用 XORShift 生成器而不是 Java 的 Random 类 long seed System nanoTime seed seed lt lt 21 seed seed gt
  • 从版本 5.0.3 开始,在 mysql 表的小数字段中存储负数

    我的表中很少有带有小数类型金额列的字段 此列将包含存款金额 正值 或取款金额 负值 我将正值存储为 120 将负值存储为 50 我对该列求和并得到了预期的结果 Mysql版本是 5 1 33 community 当我检查有关十进制的 mys
  • 在 TextView 中使用 SpannableStringBuilder 的段落间距

    正如问题所示 我正在研究TextView这将使用显示格式化文本SpannableStringBuilder 它有多个段落 我想知道使用某些内置跨度设置段落之间的间距的最简单 或至少最不复杂 的方法是什么 这可能吗 或者我需要为此构建一个自定
  • 类型错误:__init__() 需要 3 个位置参数,但给出了 4 个

    这些是我的课程的代码 class Employee def init self name gender self name name self gender gender class Salary def jump self name sa
  • UTF-8 和 UTF-16 之间有很大区别吗

    我调用一个 Web 服务 它返回一个具有 UTF 8 编码的响应 xml 我用java检查了这一点getAllHeaders method 现在 在我的 java 代码中 我获取该响应 然后对其进行一些处理 然后 将其传递给不同的服务 现在
  • Visual Studio 2010 主题,更改参数帮助背景颜色

    最近我在 Visual Studio 2010 中安装了电动工具扩展它工作得很好 但是我的文本着色主题有问题 黄昏 以及扩展的彩色参数功能 由于主题文本前景色为灰色 当 Power Tools Extensions 使用我的文本颜色显示参数
  • Chrome 扩展程序弹出窗口中单击时的 JavaScript 警报立即消失

    我正在开发一个 Chrome 扩展程序 并希望在用户单击某些元素时使用 Prompt 获取用户的输入 不幸的是 由于某种原因 当作为 onclick 或在 jQuery something click function 中调用时 我无法让p
  • 使用 JavaScript 使用 HmacSHA256 正确签署字符串

    在用于身份验证的 Houndify API 文档中 您有以下内容块 验证请求的示例 假设我们有以下信息 UserID ae06fcd3 6447 4356 afaa 813aa4f2ba41 RequestID 70aa7c25 c74f