当应用程序委托用户时保护 URL 参数(概念)
Secure URL parameters when an application delegates the user (concept)
上下文
我们有一个应用程序 A
可以指导我们的客户顾问完成基于工作流的过程。此过程的一部分已外包给自己的 Web 应用程序 - 让我们称之为应用程序 B
.
Wenn 调用应用程序 B
当前用户的证书用于 HTTP
s 连接(因为它只是将 HTTP
GET
委托给新浏览器window)。
应用程序 A
具有自动执行用户执行某些操作所需的数据,而应用程序 B
期望在调用 URL
后自动完成。
应用程序 A
还必须提供某些数据,例如 ID,以使应用程序 B
能够知道正在处理哪些客户。
要求
该应用程序 B
可以预期已完成授权 必须确保只有应用程序 A
是调用源并且用户没有更改 URL
(他可以,因为他的证书用于 HTTPS
连接)。
我们做了什么
我们考虑在参数上构建哈希,使用应用程序 A
的私钥对其进行加密,并在任何请求中将其作为附加参数提交。应用程序 B
使用应用程序 A
的 public 密钥解密哈希,在接收到的参数上构建哈希并检查参数是否未更改。
我的问题
还有什么其他可能性可以确保调用源是应用程序 A
并且参数未被用户更改?
(如果不清楚请发表评论我目前正在绘制一些图形并且可能会过度处理这个问题)。
问候
JBA
所以A为B签署了参数,这是朝着正确方向迈出的一步。
还有几件事需要考虑:
重放攻击。 B 的恶意用户可能会观察到一组由 A 签名的所需参数。他可以在未来的任何时间重放这些参数以及 A 的有效签名,即使 A 不再打算使用这些参数调用 B(比如授权信息已更改)。为了缓解这种情况,还应在请求中签名随机数或时间戳,并在验证签名时由 B 检查(应检查随机数的唯一性,时间戳不要太旧)。
参与者(谁在给谁发消息)。当 A 对消息进行签名时,签名的数据应包含预期的收件人,这样攻击者就无法将消息从 A 发送到 C,然后再将其发送给 B。当然,如果您的所有组件都只有一个实例,那就不那么简单了问题,但 A 仍然应该包含类似消息是针对 B 的 url 的内容,并且 B 应该检查签名的 url 实际上是正确的。类似地,A 应该包括由 A 签名的信息(例如他自己的 url 或 IP 地址),B 应该验证明显的和签名的发件人是相同的。
未创建签名 oracle。您应该确保用户不能将 A 用作签名 oracle 来进行签名。 A的用户可以选择自己给A签名的数据越少越好。
顺便说一下(除此之外),如果 B 可以通过某种 API 请求来查询 A 所需的所有信息,那不是更简单吗?这样你就不必为所有相对复杂的加密东西而烦恼,也不必通过用户传递敏感信息。
上下文
我们有一个应用程序 A
可以指导我们的客户顾问完成基于工作流的过程。此过程的一部分已外包给自己的 Web 应用程序 - 让我们称之为应用程序 B
.
Wenn 调用应用程序 B
当前用户的证书用于 HTTP
s 连接(因为它只是将 HTTP
GET
委托给新浏览器window)。
应用程序 A
具有自动执行用户执行某些操作所需的数据,而应用程序 B
期望在调用 URL
后自动完成。
应用程序 A
还必须提供某些数据,例如 ID,以使应用程序 B
能够知道正在处理哪些客户。
要求
该应用程序 B
可以预期已完成授权 必须确保只有应用程序 A
是调用源并且用户没有更改 URL
(他可以,因为他的证书用于 HTTPS
连接)。
我们做了什么
我们考虑在参数上构建哈希,使用应用程序 A
的私钥对其进行加密,并在任何请求中将其作为附加参数提交。应用程序 B
使用应用程序 A
的 public 密钥解密哈希,在接收到的参数上构建哈希并检查参数是否未更改。
我的问题
还有什么其他可能性可以确保调用源是应用程序 A
并且参数未被用户更改?
(如果不清楚请发表评论我目前正在绘制一些图形并且可能会过度处理这个问题)。
问候 JBA
所以A为B签署了参数,这是朝着正确方向迈出的一步。
还有几件事需要考虑:
重放攻击。 B 的恶意用户可能会观察到一组由 A 签名的所需参数。他可以在未来的任何时间重放这些参数以及 A 的有效签名,即使 A 不再打算使用这些参数调用 B(比如授权信息已更改)。为了缓解这种情况,还应在请求中签名随机数或时间戳,并在验证签名时由 B 检查(应检查随机数的唯一性,时间戳不要太旧)。
参与者(谁在给谁发消息)。当 A 对消息进行签名时,签名的数据应包含预期的收件人,这样攻击者就无法将消息从 A 发送到 C,然后再将其发送给 B。当然,如果您的所有组件都只有一个实例,那就不那么简单了问题,但 A 仍然应该包含类似消息是针对 B 的 url 的内容,并且 B 应该检查签名的 url 实际上是正确的。类似地,A 应该包括由 A 签名的信息(例如他自己的 url 或 IP 地址),B 应该验证明显的和签名的发件人是相同的。
未创建签名 oracle。您应该确保用户不能将 A 用作签名 oracle 来进行签名。 A的用户可以选择自己给A签名的数据越少越好。
顺便说一下(除此之外),如果 B 可以通过某种 API 请求来查询 A 所需的所有信息,那不是更简单吗?这样你就不必为所有相对复杂的加密东西而烦恼,也不必通过用户传递敏感信息。