我正在用PHP编写REST API,最近我遇到了授权问题。我阅读了很多关于使用私钥和公钥创建请求签名的基本授权。据说使用请求签名更安全。但后来我有一个问题:
- 用户如何传递公钥并生成签名?
我正在考虑几个选项:
1)创建自定义http标头,如X-Key,X-Signature
2)使用自定义方案的授权标头,如
AUTHORIZATION: SIGNATURE key='123' signature='abc'
3)将此值作为参数发送。但我不知道方法DELETE和PUT
是否可以接受你有什么建议?
P.S。我不想实现oAuth
答案 0 :(得分:0)
认证方案的理想属性是什么?这是可公开访问的还是内联网服务?用户帐户是否与API范围之外的内容相关联(链接的第三方帐户等)。你打算如何分发用户凭证?
我可能会坚持使用普通的旧基本授权,但在传输级别对所有内容进行加密,并强制使用HTTPS。推出自己的加密方案通常不是一个好主意。比看起来更容易成为计时或重播攻击的受害者。如果您坚持要求客户端使用密钥对进行身份验证,则可以使用HTTPS客户端证书(尽管这种方法并未广泛使用,可能有点麻烦)。
关于TLS的纯文本身份验证存在一些安全问题。首先,如果有人使用着名的CA(可能是政府机构)或CA实施MITM伪造证书,客户端被迫信任(大恶意公司代理),他们将获得凭证。但无论如何,您无法保护客户端免受其自身环境的影响。其次,基本身份验证可能容易出现CSRF,因为浏览器知道如何执行此操作,并且如果您提出了质询并且用户填写了表单,则可以记住凭据。如果您遵守REST原则并且从不允许状态更改GET请求,那么这不是一个大问题。此外,如果您使用的是JSON,never return arrays。