使用 HMAC 或 OpenSSL 进行 URL 签名

2024-02-14

我对 url 签名感兴趣(例如),但我有一些要求,但我还没有解决方案。

  • 我将使用PHP or Python对于页面,所以我需要能够使用两者之一来签名和验证签名。
  • 我的计划是使用 priv/pub 密钥方案来签署一些数据,并能够验证签名是否有效,但这就是它变得复杂的地方:
  • 验证发生时数据是未知的(不仅仅是somearg=value&anotherarg=anothervalue)

我的第一反应是使用 OpenSSL,例如使用 RSA 密钥对,执行类似于签名的操作:openssl rsautl -sign -inkey private.pem -in sensitive -out privsigned并根据privsigned仅数据和密钥:openssl rsautl -verify -inkey public.pem -in privsigned -pubin.

使用 PHP 的openssl_get_privatekey() and openssl_sign()对数据进行签名很好,但我需要知道(解密!)数据才能验证(我不会):openssl_get_publickey() and openssl_verify($data, $signature, $pubkeyid); from http://php.net/openssl_verify http://php.net/openssl_verify.

或者我在这里遗漏了什么?


所以我研究了 HMAC,但是尽管许多哈希函数在两者中都可用Python and PHP,我很困惑我该如何去做验证哈希值。PHP's hash_hmac()允许我使用“键”(或在本例中为字符串键)创建哈希。但是我如何去验证哈希值是否有效(即&sig=不只是由最终用户手动输入&sig=abcdefg1234.

总结一下(抱歉这个长问题):我如何验证我的服务器的(证书/字符串)密钥是否已生成签名/哈希(假设我无法通过重做所述数据的哈希来验证)?对于我应该选择哪条路线(Priv/pub-key 还是 HMAC),您有什么偏好吗?

任何大大小小的指点都将不胜感激! 提前致谢,

  • Josh

正如 Henning Makholm 指出的那样,HMAC 是比公钥更好的选择。您应该针对您的特定场景考虑一些会影响您的选择的最佳实践:

  • 您想在签名中考虑主机名和方案 (http/https) 吗?或许。
  • 您想考虑签名中的路径吗?大概。
  • 您想考虑签名中的查询字符串吗?大概。
  • 您想在签名之前标准化参数顺序并转义吗?通常不会。
  • 您想嵌入签名时间等(以创建有时间限制的 URL)吗?
  • 您是否想将签名 URL 与其他用户状态(例如 cookie)绑定?
  • 您是否直接在 HMAC 中使用用户生成的或用户可见的内容?如果是这样,您应该使用为每个请求随机化的值对键进行“加盐”。

计算签名时,您需要以 URL 友好的方式对其进行编码(base64 和 base32 是流行的选择)并选择 HMAC 算法(例如 SHA-256),并决定要使用多少位签名保留(将 HMAC 值截断一半通常是安全的)。如果您选择 base64,请注意 url 安全与非 url 安全实现使用的不同字母。

这是用于签名路径+查询字符串的伪代码实现(没有错误检查或加盐等):

const secret = ...;

def sign(path, querystring):
  return path + "?" + querystring + "&sig=" + url_encode(base64_encode(hmacsha256(secret, path + "?" + querystring).truncate(16)))

def verify(path, querystring):
  querystring_without_sig = remove_query_parameter(querystring, "sig")
  sig = base64_decode(url_decode(get_query_parameter(querystring, "sig")))
  if hmacsha256(secret, path + "?" + querystring_without_sig)[:16] != sig:
    raise "invalid sig"

建议使用 HMAC SHA256,并且支持所有常见语言。

Java:

Mac mac = Mac.getInstance("HmacSHA256");
mac.init(secret);
return mac.doFinal(value.getBytes());

Python:

hmac.new(secret, input, hashlib.sha256).digest()

PHP:

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

使用 HMAC 或 OpenSSL 进行 URL 签名 的相关文章

随机推荐

  • Android中的自定义对象点击问题

    I have created an custom view in android to display ball on screen Now what I want is when I touch on that ball it shoul
  • 使用 API 将 ics 文件导入到 Google 日历

    是否有任何可能的解决方案可以使用他们的 API 将 ics 文件导入谷歌日历 我参考了很多博客 但找不到适合我需要的确切解决方案 我正在节点应用程序中工作并使用节点模块创建 ics 文件 请帮我找到解决方案 提前致谢 日历 API v3 不
  • 如何在 Mac OS X 10.8 上编译 FreeImage?

    尝试使用 make 在 Mac OS X 10 8 上构建 FreeImage 3 1 5 4 时make出现以下错误g 4 0 No such file or directory发生 有关编译器配置的 makefile 有问题 如何解决这
  • Retrofit2 上的 HTTPs SSLProtocolException

    我在 Android 4 4 手机 特别是 Galaxy S4 尽管我相信这不是手机本身的问题 上遇到了问题 使用 Retrofit2 Http 在 HTTPS 连接时收到以下错误 javax net ssl SSLHandshakeExc
  • 以“select 语句”格式从函数返回结果

    我有一个如下所示的函数 CREATE OR REPLACE FUNCTION mffcu test ty hey RETURNS setof record LANGUAGE plpgsql AS function Declare cname
  • 使用 fromkeys 和可变对象创建字典。一个惊喜[重复]

    这个问题在这里已经有答案了 我在 Python 2 6 和 3 2 中遇到了令我惊讶的行为 gt gt gt xs dict fromkeys range 2 gt gt gt xs 0 1 gt gt gt xs 0 append 1 g
  • 具有不同高度项目的网格布局(React Native)

    Any idea for implementing a grid layout like the following image 答案取决于您要显示的数据 我想这是一个无限列表 向下滚动时会加载更多项目 如果是这种情况 你需要输入 3Lis
  • 流畅的 NHibernate QueryOver 选择不在另一个表中的项目(左连接)

    我有两张桌子 all 编号 丙A 道具B 其他一些专栏 hidden 编号 丙A 道具B 和相应的类 已映射 尚未映射关系 我想从第一个表中获取所有行 减去匹配的任何结果propA or propB财产 我设法通过 Criteria API
  • 重定向 Rails 4 中特定控制器的记录器输出

    我根据上一个问题的答案构建了一个解决方案重定向 Rails 3 中特定控制器的记录器输出 https stackoverflow com q 28821668 56082对于 Rails 3 它工作得很好 但是现在我尝试将相同的基于中间件的
  • buildQueryString 函数的 Purescript 类型

    我是 Purescript 的新手 我正在尝试编写一个函数 可以获取任何记录值并迭代字段和值并构建 一个查询字符串 我在想这样的事情 buildQueryString forall a PropertyTraversible r gt r
  • 复选框操作

    由于某种原因 这段小代码阻止用户检查实际的复选框并将复选标记放入其中 而检查它的唯一方法是单击该行 table tr click function checkBox this children td children input type
  • Cygwin git Push 挂起,msysgit 还好

    我使用代理 而且我对 git 很陌生 而且我使用的是 Windows XP 我已经能够制作一个git push origin master从 msysgit 工作 但无法使用 Cygwin 的 git 在 Cygwin 中工作 我在两个环境
  • 如何在 ASP Dropdownlist 列表项中使用彩色圆圈? (没有 jQuery)

    Goal 我想要一个下拉列表 如果某人的可用性为 True 则显示绿色 如果某人的可用性为 False 则显示红色 注意 我需要在没有 jQuery 的情况下完成此操作 我刚刚被告知我们不允许在我们的项目中使用 jquery 问题 背景 我
  • 允许双 URL 编码的请求路径有效

    我有一个在 IIS 7 0 上运行的标准 ASP Net WebForms 应用程序 带有集成托管管道 我们网站上的许多图像的文件名中都有空格 例如 baseball drawing gif 当我们将这些图像放入 html 页面时 我们对路
  • 使用参数调用事件处理程序[重复]

    这个问题在这里已经有答案了 我正在尝试使用参数调用事件处理程序 它工作得很好 没有争论 我这里哪里出错了 var box box function changeColor a this css background a box click
  • ForeignKey(User, unique=True) 和 OneToOneField 之间的区别[重复]

    这个问题在这里已经有答案了 之间有什么不同models ForeignKey Modelname unique True and models OneToOneField在姜戈 我应该在哪里使用models OneToOneField an
  • TextField maxLength - Android Jetpack Compose

    是否有任何开箱即用的解决方案来限制 TextField 中的字符大小 我没有看到任何像 XML 中那样的 maxLength 参数 您可以使用onValueChange参数限制字符数 var text by remember mutable
  • 左平衡二叉树

    我正在读一本关于数据结构的书 它说左平衡二叉树是一棵树 其中叶子仅占据最后一层的最左边位置 这对我来说似乎有点模糊 这是否意味着叶子仅位于根的左侧并分布在整个级别 或者叶子仅存在于整个树的左侧 究竟什么构成左平衡 我不确定我的猜测是否涵盖了
  • 如何将菜单项添加到 iOS 中的共享菜单

    我刚刚开始进行 iOS 开发 但我必须尽早做的事情是向系统菜单添加一个按钮 就像 Dropbox 在与电子邮件附件交互时添加按钮一样 该应用程序将用于视频 因此在共享菜单上为 QuickTime 播放器添加一个按钮将是理想的选择 我浏览了文
  • 使用 HMAC 或 OpenSSL 进行 URL 签名

    我对 url 签名感兴趣 例如 但我有一些要求 但我还没有解决方案 我将使用PHP or Python对于页面 所以我需要能够使用两者之一来签名和验证签名 我的计划是使用 priv pub 密钥方案来签署一些数据 并能够验证签名是否有效 但