- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在为我的 JSON-RPC API
进行身份验证,我目前的工作策略是使用通过 POST
通过 SSL
发送的签名请求.
我想知道是否有人可以通过以下签名方法看到我没有考虑到的任何漏洞。
客户端和服务器之间的所有通信都是通过通过 SSL
发送的 POST
请求完成的。不安全的 http
请求会被 API 服务器完全拒绝。
依赖关系
var uuid = require('node-uuid');
var crypto = require('crypto');
var moment = require('moment');
var MyAPI = require('request-json').newClient('https://api.myappdomain.com');
依赖链接:node-uuid , crypto , moment , request-json
变量
var apiVersion = '1.0';
var publicKey = 'MY_PUBLIC_KEY_UUID';
var secretKey = 'MY_SECRET_KEY_UUID';
请求对象
var request = {
requestID : uuid.v4(),
apiVersion : apiVersion,
nonce : uuid.v4(),
timestamp : moment.utc( new Date() ),
params : params
}
签名
var signature = crypto.createHmac('sha512',secretKey).update(JSON.stringify(request)).digest('hex');
有效负载打包(通过 SSL
上的 POST
作为明文发送)
var payload = {
request: request,
publicKey : publicKey,
signature : signature
}
结果负载 JSON 文档
{
"request" : {
"requestID" : "687de6b4-bb02-4d2c-8d3a-adeacd2d183e",
"apiVersion" : "1.0",
"nonce" : "eb7e4171-9e23-408a-aa2b-cd437a78af22",
"timestamp" : "2014-05-23T01:36:52.225Z",
"params" : {
"class" : "User"
"method" : "getProfile",
"data" : {
"id" : "SOME_USER_ID"
}
}
},
"publicKey" : "PUBLIC_KEY",
"signature" : "7e0a06b560220c24f8eefda1fda792e428abb0057998d5925cf77563a20ec7b645dacdf96da3fc57e1918950719a7da70a042b44eb27eabc889adef95ea994d1",
}
POST 请求
MyAPI.post('/', payload, function(response){
/// Handle any errors ...
/// Do something with the result ...
/// Inspect the request you sent ...
});
服务器端
然后在服务器端发生以下以验证请求:
PUBLIC_KEY
用于在数据库中查找SECRET_KEY
。SECRET_KEY
用于从负载中创建 request
对象的 HMAC。signature
哈希值与在服务器上创建的request
对象的哈希值进行比较。如果它们匹配,我们将继续验证时间戳
。request
对象中发送的 timestamp
,因为它包含在从客户端发送的 signature
哈希中, timestamp
被评估,如果请求太旧,身份验证将被拒绝。否则,请求通过身份验证。据我所知,这是一种通过 SSL
发送签名和身份验证请求的安全方法。这是正确的吗?
在此先感谢您的帮助。
JSON Property Order 更新
The order of properties when using
JSON.stringify
is essentially random, which could cause signature mis-matches.
在过去几周使用这个签名过程,由于 JSON request
对象中的属性顺序,我没有遇到任何哈希不匹配问题。我相信这是因为我只对 request
对象文字进行了一次字符串化,就在计算客户端哈希之前。然后,request
对象以 JSON 格式作为 payload
的一部分。服务器接收到哈希值后,直接从负载中接收到的 JSON 对象创建哈希值,不会调用第二个 JSON.stringify
方法,因此签名始终匹配,因为属性的顺序已确定一次, 由客户。我会继续研究这个问题,因为它看起来是一个弱点,如果不是安全问题的话。
最佳答案
JSON.stringify
不保证属性的顺序。例如对象
{
a: 1,
b: 2
}
可以用两种方式序列化:{"a":1,"b":2}
或 {"b":2,"a":1}
。从 JSON 的角度来看,它们是相同的,但它们会产生不同的 HMAC。
想象一下,对于签名,您的 JSON.stringify
生成第一种形式,但用于检查签名的第二种形式。尽管签名有效,但您的签名检查将失败。
关于node.js - 这个 API 签名请求方法安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23820128/
我正在学习 Spring 安全性,但我对它的灵活性感到困惑.. 我知道我可以通过在标签中定义规则来保护网址 然后我看到有一个@secure 注释可以保护方法。 然后还有其他注释来保护域(或 POJO)
假设有一个 key 加密 key 位于内存中并且未写入文件或数据库... byte[] kek = new byte[32]; secureRandom.nextBytes(kek); byte[]
我有 Spring Security 3.2.0 RC1 的问题 我正在使用标签来连接我 这表示“方法‘setF
我正在创建一个使用 Node Js 服务器 API 的 Flutter 应用程序。对于授权,我决定将 JWT 与私钥/公钥一起使用。服务器和移动客户端之间的通信使用 HTTPS。 Flutter 应用
在过去的几年里,我一直在使用范围从 Raphael.js 的 javascript 库。至 D3 ,我已经为自己的教育操纵了来自网络各地的动画。我已经从各种 git 存储库下载了 js 脚本,例如 s
在 python 中实现身份验证的好方法是什么?已经存在的东西也很好。我需要它通过不受信任的网络连接进行身份验证。它不需要太高级,只要足以安全地获取通用密码即可。我查看了 ssl 模块。但那个模块让我
我正在尝试学习“如何在 Hadoop 中实现 Kerberos?”我已经看过这个文档 https://issues.apache.org/jira/browse/HADOOP-4487我还了解了基本的
我有一个带有 apache2、php、mysql 的生产服务器。我现在只有一个站点 (mysite.com) 作为虚拟主机。我想把 phpmyadmin、webalizer 和 webmin 放在那里
前些天在网上看到防火墙软件OPNsense,对其有了兴趣,以前写过一个其前面的一个软件M0n0wall( 关于m0n0wa
我在 Spring Boot 和 oauth2(由 Google 提供)上编写了 rest 后端,在 "/login" 上自动重定向。除了 web 的 oauth 之外,我还想在移动后端进行 Fire
我想调用类 Foo,它的构造函数中有抽象类 Base。我希望能够从派生自 Base 的 Derived 调用 Foo 并使用 Derived覆盖方法而不是 Base 的方法。 我只能按照指示使用原始指
如何提高 session 的安全性? $this->session->userdata('userid') 我一直在为我的 ajax 调用扔掉这个小坏蛋。有些情况我没有。然后我想,使用 DOM 中的
我目前正在为某些人提供程序集编译服务。他们可以在在线编辑器中输入汇编代码并进行编译。然后编译它时,代码通过ajax请求发送到我的服务器,编译并返回程序的输出。 但是,我想知道我可以做些什么来防止对服务
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
目前,我通过将 session 中的 key 与 MySQl 数据库中的相同 key 相匹配来验证用户 session 。我使用随机数重新生成 session ,该随机数在每个页面加载时都受 MD5
Microsoft 模式与实践团队提供了一个很棒的 pdf,称为:“构建安全的 asp.net 应用程序”。 microsoft pdf 由于它是为 .Net 1.0 编写的,所以现在有点旧了。有谁知
在 Lua 中,通常会使用 math.random 生成随机值和/或字符串。 & math.randomseed , 其中 os.time用于 math.randomseed . 然而,这种方法有一个
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我们有一个严重依赖 Ajax 的应用程序。确保对服务器端脚本的请求不是通过独立程序而是通过坐在浏览器上的实际用户的好方法是什么 最佳答案 真的没有。 通过浏览器发送的任何请求都可以由独立程序伪造。 归
我正在寻找使用 WebSockets 与我们的服务器通信来实现 web (angular) 和 iPhone 应用程序。在过去使用 HTTP 请求时,我们使用请求数据、url、时间戳等的哈希值来验证和
我是一名优秀的程序员,十分优秀!