Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest 保护API:SSL&;HTTP基本身份验证与签名_Rest_Security_Authentication_Digital Signature_Restapi - Fatal编程技术网

Rest 保护API:SSL&;HTTP基本身份验证与签名

Rest 保护API:SSL&;HTTP基本身份验证与签名,rest,security,authentication,digital-signature,restapi,Rest,Security,Authentication,Digital Signature,Restapi,在为我们的web应用程序设计API时,我们将使用其子域作为“用户名”,并生成API密钥/共享密钥。首先,可以使用子域作为用户名吗?我看不出生成另一个密钥的好处 不同的API似乎做了两件事之一: 将HTTP基本身份验证与SSL一起使用 在每个请求中,用户名设置为子域,密码设置为API密钥。因为我们使用的是SSL,所以这应该不会被欺骗 值得注意的API:, 创建具有共享机密的请求签名 通常通过对密钥/值对排序并使用HMAC-SHA1和共享密钥生成签名来实现。然后将签名与请求一起发送,并在另一端进行验

在为我们的web应用程序设计API时,我们将使用其子域作为“用户名”,并生成API密钥/共享密钥。首先,可以使用子域作为用户名吗?我看不出生成另一个密钥的好处

不同的API似乎做了两件事之一:

  • 将HTTP基本身份验证与SSL一起使用
  • 在每个请求中,用户名设置为子域,密码设置为API密钥。因为我们使用的是SSL,所以这应该不会被欺骗

    值得注意的API:

  • 创建具有共享机密的请求签名
  • 通常通过对密钥/值对排序并使用HMAC-SHA1和共享密钥生成签名来实现。然后将签名与请求一起发送,并在另一端进行验证

    值得注意的API:

    PS:没错,Google Checkout同时支持这两种功能

    编辑:只需阅读OAuth 2正在删除签名,以便通过SSL发送用户名/密码


    任何人对选择什么有什么意见:SSL还是签名?

    只要存在某种形式的秘密,就可以使用子域作为用户名

    使用共享秘密的好处是,执行请求的“一方”不需要知道秘密,只需要知道签名即可执行请求。例如,如果您希望您的用户允许通过浏览器发出请求,这是非常有益的

    使用S3,您可以创建签名,将其发送到浏览器,并直接从浏览器上传到S3


    您还可以使用HTTP摘要,这两者都有好处。您仍然可以轻松地在浏览器中测试API,因为浏览器支持摘要和Basic,而且纯文本密码永远不会通过网络发送。

    根据我的研究,通过SSL的HTTP Basic身份验证是完全安全的

    毕竟,使用SSL(严格来说是TLS)意味着传输层是加密的,我们可以安全地假设通过SSL传递的任何信息都是安全的,并且没有被篡改


    因此,在不生成签名的情况下传递用户名和密码就足够了。

    Igor的答案并不完全正确。尽管TLS确实确保传输层是加密的和安全的,但它仍然不如使用TLS和相互认证那样安全,例如,客户端使用数字签名形式的“强加密”进行认证。这仍然优于TLS上的基本身份验证,主要有两个原因:

    • 密码就是密码,我假设地球上70亿人中有三人使用30个字符的密码,这是完全随机的。我们其他人选择了熵小得多的东西。因此,攻击者更容易对使用密码而不是数字签名的服务进行暴力攻击

    • 有人可能会争辩说,对于客户端数字签名,还涉及密码,通常用于访问私钥。但这与我们使用Basic Auth时的情况仍有很大不同:首先,私钥作为资源驻留在客户机的机器上,因此即使它被恢复,也只会影响一个人而不是所有人;其次,对于PKCS#12等典型密钥容器格式,还可以使用基于密码的加密来访问密钥。这些算法是专门设计用来减慢攻击者的速度,以降低他们每单位时间内的暴力尝试率,这也是数字签名的一个优势


    毫无疑问,TLS Basic Auth的设置和使用要方便得多,但对于高安全性环境,我总是更喜欢“强加密”而不是用户/密码解决方案,这是值得的。

    OpenSSL的令人心碎的问题说明了仅依靠SSL保护API的潜在陷阱。根据API的使用和SSL传输被破坏的影响,可能需要采取额外的安全措施,如浮雕的回答中所述。

    我想指出security.stackexchange.com上提到的一些事情,因为您说“通过SSL的HTTP基本身份验证在我的研究中是完全安全的。”。您可能会争辩说,下面的第3点和第4点很少对RESTAPI有效,但这实际上取决于它们的实现方式

    “HTTP基本身份验证存在一些问题:

    • 密码以base64编码(可以是 易于转换为纯文本)
    • 每次请求都会重复发送密码。(更大的攻击) (窗口)
    • 密码由webbrowser缓存,至少对于 窗口/进程的长度。(可由任何 对服务器的其他请求,例如CSRF)
    • 如果用户
      请求。(与前一点相同,另外可能被
      共享计算机上的另一个用户)
    其中,使用SSL只能解决第一个问题。即使如此,SSL也只能在Web服务器(任何内部路由、服务器日志记录等)看到明文密码之前进行保护

    因此,与任何事情一样,重要的是要看到整个画面。 HTTPS是否在传输过程中保护密码?-是的


    这就足够了吗?通常不会。(我想说,永远不会——但这真的取决于你的网站是什么以及它需要有多安全。)“

    回答一个老问题,因为没有人真正触及要点

    SSL/TLS与所有PKI一样存在根本性缺陷,因为它们依赖的信任链已被越来越多地证明易受以下因素影响:

    • 认证机构已经并可能被黑客入侵。许多案例中的一个例子是CA被泄露数月后,所有证书都被撤销。同时