为了账号安全,请及时绑定邮箱和手机立即绑定

在 HTML5 SPA 中执行有效负载签名的有效方式

在 HTML5 SPA 中执行有效负载签名的有效方式

白衣非少年 2022-09-14 16:01:14
我希望实现一些有效的(即具有良好的性能)逻辑,以便在我们的Web应用程序中进行有效负载签名。目标是让 HTML5 客户端保证接收到的有效负载的内容确实是由我们的后端生成的内容。我们不想使用共享盐进行有效负载哈希生成,因为用户可以轻松打开HTML5源代码并找到盐短语。我们现在已经实现了 RSA 签名,其中后端使用其私钥添加有效负载签名,我们的 HTML5 客户端使用其内置的公钥对其进行验证。但是,签名生成过程需要 250 毫秒(对于相对较小的有效负载),并且由于签名请求的性质,此时间量是不可接受的。唯一的另一个想法是在运行时生成一个共享密钥,每次客户端初始化其与后端的会话时。然而,这个秘密不能以明文形式发送,所以看起来我们将不得不实现一个Diffie-Hellman交换机制,如果可能的话,我们希望避免这种情况,或者使用现有库自动化。请记住,由于我们销售产品的方式的性质,保密和加密需要在应用程序层完成。我们不希望加密我们的流量,这是我们的客户可能会或可能不会实现的东西(因为它是一个 Intranet 应用程序)。但是,我们必须避免向他们公开与我们的许可检查机制等相关的内容。后端不是基于云的,也不由我们控制,而是安装在客户的本地计算机上。前端是爪哇脚本,后端是爪哇。
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

请注意,Diffie-Hellman 交换机制不受 MITM 攻击的保护,因此不加密流量意味着您需要对来自服务器的 DH 数据进行身份验证。这就是为什么使用基于DH的密码套件的Web服务器使用其服务器证书的私钥对通过网络发送的DH元素进行签名的原因,以便客户端检查这些元素是否确实来自他要连接到的服务器。这些元素是公开的,但需要签名。

您所说的“具有共享盐的有效负载哈希生成”是一个键控哈希消息身份验证代码,因此它基于共享密钥,正如您所注意到的,并且由于您不想使用此机制,这意味着您不信任客户端。因此,您必须使用非对称加密对有效负载进行签名。

使用非对称算法对服务器有效负载进行签名意味着您首先需要让服务器与客户端共享公钥。由于您不加密客户端和服务器之间的数据,因此您需要在客户端源代码中部署服务器公钥。

您谈到了签名生成过程,但是客户端上的签名检查过程在您的情况下也非常重要,因为用户等待结果的总时间是添加签名时间和检查签名的时间(而且,签名通常可以在服务器上预测, 如果要签名的数据不是动态生成的,但永远无法预料到验证)。因此,您需要一种快速检查客户端签名的方法。首先,对哈希值进行签名,而不是对整个有效负载进行签名。然后选择客户端开发环境中可用的最快非对称签名算法。请注意,检查 RSA 签名比检查 DSA 或 ECDSA 签名更快,因为相应的密钥长度对应于相同的安全级别。所以你应该留在RSA。

直到这条线之前,所有这些可能不会对您有太大帮助!现在有一种方法可以使用RSA来签名和验证签名来提高性能,这种方式与SSL / TLS在从同一服务器下载多个页面或其他对象时实现以提高浏览器性能的方式完全相同:使用会话缓存。您与一个特定用户共享特定会话的公共密钥。切勿将此常见机密用于其他会话。当用户首次连接时,仅使用 RSA 一次,以交换临时共享机密或交换 DH 材料以创建此共享机密。然后,每次服务器需要对对象进行签名时,它都会使用此特定密钥创建一个键控哈希消息身份验证代码。因此,如果用户找到该机密,例如使用浏览器的调试模式,则这不是问题:此机密仅用于帮助他知道来自服务器的内容未被更改。因此,用户不能使用此密钥来更改服务器与其他用户之间的数据交换。


查看完整回答
反对 回复 2022-09-14
?
繁花如伊

TA贡献2012条经验 获得超12个赞

我们最终在客户端和服务器端都使用了 TweetNaCl。该库提供了一种简单快捷的方法来进行类似DH的共享密钥交换,而无需通过自定义实现。使用短暂的共享密钥,我们可以轻松生成哈希值,而不是有效载荷的签名,从250ms下降到10μs。此外,RSA签署初始DH交换也很重要,也是我们使用RSA的唯一地方。

请阅读@AlexandreFenyo答案,了解通常如何处理此类情况的正确理论。


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号