我已经阅读了许多关于版本化RESTful服务的Stack Overflow(和其他)帖子.说实话,这有点压倒性的.
我决定对我们的(边缘)RESTful服务使用Accept:标头,以便客户端可以请求特定版本的资源.我不清楚的是在Accept标头中指定的内容.
我经常看到的例子是这样的:
Accept: application/vnd.mycompany.myapp.customer-v2+json
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我是否正确所有vnd类型必须注册?(http://www.iana.org/cgi-bin/mediatypes.pl)
版本和类型(即-v2 + json)是该类型的一部分,因此需要注册每个版本和类型吗?
是否有任何理由使用vnd而不是不需要注册的"x-"子类型?例如:
Accept: application/x-mycompany.myapp-v2+json
Run Code Online (Sandbox Code Playgroud)
现有的API仅供内部使用,但将来会向客户展示.
不确定这是否有意义,但可以使用现有类型但添加版本吗?(当前API返回"application/json")
Accept: application/json-v2
Run Code Online (Sandbox Code Playgroud)附加版本和类型的可接受格式是什么(例如-v2 + json).
如果客户端要求提供不受支持的版本,该怎么办?406是正确答案吗?客户可以请求任何版本吗?或者更一般地说,如果客户端不提供Accept标头或Accept:*/*,该怎么办?
任何其他建议欢迎.当然,目标是允许更改服务为给定资源返回的内容,但不会破坏现有客户端.
这是我最近查看过的一小部分资源:
随着最近(例如LinkedIn)关于密码的讨论,我正在研究密码哈希实现.喝完两杯咖啡和早上读书后,我不再是一个密码学家了.我真的不想假装自己.
使用整数唯一用户ID失败是否有效?(crypt()只使用16位?)
如果我只是一遍又一遍地在哈希上运行sha256(),直到一秒钟用完就能击败蛮力攻击?
如果我必须问这些问题我应该使用bcrypt吗?
目标很简单,如果我的用户的哈希密码被泄露了:
我在#1中读到的是哈希计算必须是昂贵的 - 例如,计算一两秒或者可能需要一点或内存(以阻止硬件解密).
bcrypt有这个内置的,如果我理解正确的话,scrypt更具有前瞻性,并且包含最低内存使用要求.
但是,通过"重新散布"sha256()的结果,需要多次使用几秒钟,然后将最终循环计数与哈希值一起存储以便稍后检查提供的密码,这是一种同样有效的方法吗?
对于#2,为每个密码使用唯一的盐很重要.目前尚不清楚的是盐必须是随机的(或大的).如果目标是避免使用"mypassword"作为密码的每个人拥有相同的哈希,那么仅仅这样做是不够的?:
hash = sha256_hex( unique_user_id + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)
甚至这个,虽然我不确定它会给我什么:
hash = sha256_hex( sha256( unique_user_id ) + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)
使用用户ID可以看到的唯一好处,除了我知道它是唯一的,是避免必须保存盐与哈希.没有多大优势.使用用户的ID作为盐是否存在真正的问题?它没有完成#2吗?
我假设如果有人可以窃取我的用户的哈希密码,那么我必须假设他们可以得到他们想要的任何东西 - 包括生成哈希的源代码.那么,在散列之前向密码添加额外的随机字符串(相同的字符串)是否有任何好处?那是:
# app_wide_string = one-time generated, random 64 7-bit *character* string.
hash = sha256_hex( unique_user_id + app_wide_string + user_supplied_password );
Run Code Online (Sandbox Code Playgroud)
我已经看到了这个建议,但我不明白我从那个用户的盐中得到了什么.如果有人想强行攻击他们会知道"app_wide_string"并在运行他们的字典攻击时使用它,对吗?
如上所述,是否有充分的理由使用bcrypt滚动我自己?也许我问这些问题的理由足够了吗?
顺便说一句 - 我只是计算了我现有的散列函数和我的笔记本电脑,我每秒可以生成大约7000个哈希值.不太经常建议的一两秒钟.
一些相关链接:
我知道几乎没有C++,所以没有帮助,而我的XS并没有好多少.我正在为C++库创建一个XS接口,我几乎所有的方法都在工作,除了一个.
Perl中的方法应如下所示:
$return_data = $obj->readPath( $path );
Run Code Online (Sandbox Code Playgroud)
该方法定义为.h文件:
int readPath(const char* path, char* &buffer, bool flag=true);
Run Code Online (Sandbox Code Playgroud)
如果以"NULL"传递,"缓冲区"将被分配.
另外两个版本的readPath具有不同的签名,但它们不是我想要的版本.(有趣的是,当我尝试编译时,它告诉我"候选人"是我不想要的两个.)那是因为它不理解"char*&"吗?
有人可以帮助我需要写的xsub吗?
我在使用Perl 5.14.2.
顺便说一句 - 我还使用了一个类型映射"long long int"到T_IV.我找不到任何关于如何正确键入long long长度的文档.任何建议我应该如何长期打字?
谢谢,
我向客户提供Web服务。我想提供一种功能,在发生某种事件时,我会通过向客户提供的URL发送请求来通知客户。
例如,可以通过GET请求https://customer.example.com/order/12345?status=shipped发送订单发货通知。
客户如何信任此请求是真实的请求?
当客户收到此请求时,他们需要验证该请求确实来自服务,该请求未被篡改并且是私有的。
想到仅通过SSL发送给客户,但是要求客户运行带有签名证书的启用SSL的Web服务器。另外,要验证服务(此请求中的客户端),需要客户端证书。但是,SSL应该处理加密,中间人,消息签名和重播攻击。
服务的IP地址可以更改,因此无需进行身份验证。
PayPal的IPN系统使用了另一种方法。PayPal向客户(在此示例中为商家)发送通知,然后客户通过SSL将有效负载发送回PayPal进行确认。本质上是在问:“嘿,贝宝。您发给我了吗?”
您还能想到其他方法吗?
api ×1
bcrypt ×1
encryption ×1
hash ×1
mime-types ×1
passwords ×1
perl ×1
rest ×1
salt ×1
security ×1
web-services ×1
webhooks ×1
xs ×1