现代客户端/服务器认证技术

3 投票
3 回答
2379 浏览
提问于 2025-04-15 17:27

我正在开发一个非浏览器的客户端-服务器应用程序(XULRunner-CherryPy),通过HTTP进行通信。现在我在考虑用户认证的问题。因为我对安全方面的知识不多,所以我更倾向于使用那些经过验证的方法和现成的库,而不是自己去发明或构建一些东西。

最近我读了很多文章,结果让我感到很沮丧,尤其是因为这篇这篇博客的内容。

我觉得我需要的是:

  • 在数据库中安全存储密码(自适应哈希?)
  • 安全传输用户凭证(摘要认证?SSL?)
  • 后续请求的安全令牌认证(对此不太确定)

所以问题是:现在有哪些现代的(最好是简单易用的)技术和/或库可以实现这些?(不会存储敏感信息,比如信用卡号)。

我在看OAuth,他们有一个新的版本,强烈推荐使用。问题是文档还在开发中,并且没有库来实现这个新版本(?)。

3 个回答

1

这可能不是一个完整的答案,但我想给大家带来一些关于彩虹表和网络的安慰消息。关于网络,我觉得不需要太担心彩虹表,原因有以下几点:

(1) 彩虹表破解是通过查看被加密的密码来实现的。在网络上,这个被加密的密码是存储在你的数据库里的。所以,要想使用彩虹表,首先得先黑进你的整个数据库。

(2) 如果你像大多数密码存储系统那样使用了盐值,那么彩虹表就变得很难用了。简单来说,盐值是在密码后面加上一些额外的内容。为了使用彩虹表,它必须能够处理每个明文密码中的这些额外内容。例如,你给我们的第一个链接中提到的彩虹表实现可以破解最多14个字符的密码。因此,如果你的盐值超过14个字节,那这个系统就没用了。

1

亚马逊网络服务(Amazon Web Services)、OpenID 和 OAuth 都有请求签名的例子。亚马逊网络服务是一个比较简单的例子,因为它的交互没有更复杂的协议。基本上,它们的过程是让客户端或服务器通过用一个事先设置好的密钥(或密钥对)对所有字段进行哈希处理来签名请求,然后另一方通过同样的方式来验证这个签名。为了防止重复使用哈希值,会在字段中加入一个随机数(nonce)或时间戳。

设置密钥或其他凭证可以通过SSL进行,值得注意的是,OAuth WRAP的一个动机就是用SSL来替代部分或全部的请求签名,这样实现起来会更简单。

1

经过一番探索和尝试,我想根据亚马逊S3的设计写一个自己的原型,我觉得这个设计挺安全的。后来我发现了一个很棒的网站,里面有我所有问题的答案,还有一个企业安全API工具包,以及更多更多的内容:OWASP

撰写回答