我目前正在开发一个RESTful API服务器,我正在使用ID and password
或使用token
对用户进行身份验证之间进行选择。
让我先解释一下我的情况。我需要在我的库中包含静态身份验证信息,以便在客户端和服务器之间进行通信,或者将其提供给合作公司,以便在他们的服务器和我的服务器之间进行沟通。当我研究其他与我们处境相似的服务时,他们现在使用token
(例如,Bugfender
使用token
来指定用户(。
然而,我认为使用ID and PW
和使用token
是相同的,或者使用ID and PW
更好,因为有两个因素可以比较它是正确的还是不正确的。
其他服务使用token
的原因是什么?
从安全角度来看,哪一个更好,或者有更好的方法吗?
我认为,如果您要在客户端上使用固定的用户名/密码或一些固定的令牌,那么安全级别是相同的。
用户名和密码不被视为多因素身份验证。多因素意味着你通过多种因素对某人进行身份验证:
- 你知道什么。这可以是用户名和密码的组合,也可以是一些特殊的令牌
- 你有什么。可能是一些硬件生成了额外的一次性密码——你手机上的谷歌验证器应用程序,或者在某个时间到期后收到的带有OTP的短信
- 你是什么。例如,这是你眼睛的指纹或视网膜
- 你在哪里。如果适用于您的设置,这可以是源的IP地址
- 你的行为。您使用该服务的正常方式是什么
等。
也许不需要提及这两者——令牌和用户名/密码组合必须在加密请求中携带(我相信您使用的是HTTPS(。否则,客户的身份可能会被盗。
您将如何向客户端库提供凭据?我认为这是最棘手的部分。如果这些凭据在服务器上保存为配置(或者更糟的是硬编码(,那么存储是否足够安全?谁可以访问它。你能避开它吗?
如果您的合作伙伴公司意识到用户名/密码被泄露,会发生什么?他们自己能轻易改变吗?或者您可以以多快的速度撤销被盗凭据的权限?
我的建议是在服务器上保留审核日志,记录客户端请求的活动。还要记住GDPR,如果你使用欧洲服务器,请根据你要审计的日志检查你所在国家的类似法规。
如果凭据(ID和密码(和令牌以相同的方式(例如:通过REST请求中的标头(通过TLS安全通道传输,唯一的区别在于密码的熵与令牌的熵。由于在这两种情况下都是由您自己决定的,因此从安全角度来看没有真正的区别。
注意:我不把ID算作秘密,因为它通常比秘密更容易猜测。
我会选择一个更易于实施和管理的解决方案。
IMHO这将是HTTP基本身份验证,因为您通常会得到框架/web服务器的完全支持,在身份验证逻辑中几乎不会出现安全错误。你知道,朋友不会让朋友自己写授权书。(