小编use*_*426的帖子

供应商MIME类型(用于API版本控制)

我已经阅读了许多关于版本化RESTful服务的Stack Overflow(和其他)帖子.说实话,这有点压倒性的.

我决定对我们的(边缘)RESTful服务使用Accept:标头,以便客户端可以请求特定版本的资源.我不清楚的是在Accept标头中指定的内容.

我经常看到的例子是这样的:

Accept: application/vnd.mycompany.myapp.customer-v2+json
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 我是否正确所有vnd类型必须注册?(http://www.iana.org/cgi-bin/mediatypes.pl)

  2. 版本和类型(即-v2 + json)是该类型的一部分,因此需要注册每个版本和类型吗?

  3. 是否有任何理由使用vnd而不是不需要注册的"x-"子类型?例如:

    Accept: application/x-mycompany.myapp-v2+json
    
    Run Code Online (Sandbox Code Playgroud)

    现有的API仅供内部使用,但将来会向客户展示.

  4. 不确定这是否有意义,但可以使用现有类型但添加版本吗?(当前API返回"application/json")

    Accept: application/json-v2
    
    Run Code Online (Sandbox Code Playgroud)
  5. 附加版本和类型的可接受格式是什么(例如-v2 + json).

  6. 如果客户端要求提供不受支持的版本,该怎么办?406是正确答案吗?客户可以请求任何版本吗?或者更一般地说,如果客户端不提供Accept标头或Accept:*/*,该怎么办?

任何其他建议欢迎.当然,目标是允许更改服务为给定资源返回的内容,但不会破坏现有客户端.

这是我最近查看过的一小部分资源:

api rest mime-types

30
推荐指数
1
解决办法
8395
查看次数

网络应用密码:bcrypt和SHA256(以及scrypt)

随着最近(例如LinkedIn)关于密码的讨论,我正在研究密码哈希实现.喝完两杯咖啡和早上读书后,我不再是一个密码学家了.我真的不想假装自己.

具体问题

  1. 使用整数唯一用户ID失败是否有效?(crypt()只使用16位?)

  2. 如果我只是一遍又一遍地在哈希上运行sha256(),直到一秒钟用完就能击败蛮力攻击?

  3. 如果我必须问这些问题我应该使用bcrypt吗?

讨论/说明:

目标很简单,如果我的用户的哈希密码被泄露了:

  1. 破解不会"容易"
  2. 破解一个密码不会暴露使用相同密码的其他用户).

我在#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个哈希值.不太经常建议的一两秒钟.

一些相关链接:

使用sha256作为散列和使用用户ID进行腌制

SHA512与Blowfish和Bcrypt

用户密码盐的最佳长度是多少?

encryption passwords hash salt bcrypt

13
推荐指数
1
解决办法
8442
查看次数

Perl XS和C++将指针传递给缓冲区

我知道几乎没有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长度的文档.任何建议我应该如何长期打字?

谢谢,

perl xs

5
推荐指数
1
解决办法
539
查看次数

Webhook回调安全性

我向客户提供Web服务。我想提供一种功能,在发生某种事件时,我会通过向客户提供的URL发送请求来通知客户。

例如,可以通过GET请求https://customer.example.com/order/12345?status=shipped发送订单发货通知。

客户如何信任此请求是真实的请求?

当客户收到此请求时,他们需要验证该请求确实来自服务,该请求未被篡改并且是私有的。

想到仅通过SSL发送给客户,但是要求客户运行带有签名证书的启用SSL的Web服务器。另外,要验证服务(此请求中的客户端),需要客户端证书。但是,SSL应该处理加密,中间人,消息签名和重播攻击。

服务的IP地址可以更改,因此无需进行身份验证。

PayPal的IPN系统使用了另一种方法。PayPal向客户(在此示例中为商家)发送通知,然后客户通过SSL将有效负载发送回PayPal进行确认。本质上是在问:“嘿,贝宝。您发给我了吗?”

您还能想到其他方法吗?

security authentication web-services webhooks

5
推荐指数
1
解决办法
1976
查看次数