公共API的密码处理?

时间:2014-03-06 07:02:30

标签: security

我不了解存储/处理密码的一些概念。

例如,我们的网站有一个提供身份验证的移动应用程序(iOS,Android等)的公共API。

毫无疑问,我们不能将原始密码存储在数据库中,我们不能在客户端和服务器之间发送原始密码,因此我们使用哈希和盐。

这样,我们加密客户端上的密码并将哈希发送到服务器。但是,如果一个“黑帽子”窃取密码哈希并用它验证服务器api怎么办?

我应该在客户端上散列密码,发送散列,然后在服务器上再次散列它们吗?

这个问题的常见解决方案是什么?

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

您可以使用SSL来保护客户端和服务器之间的通信通道,并发送未加密的密码。

第二种方法 - 在服务器中存储散列密码(不含盐),并在进行身份验证时 - 从服务器获取随机令牌(将在几分钟后过期),从客户端密码计算散列并使用计算的散列对接收的令牌进行编码。然后将编码令牌发送到服务器。服务器执行相同的操作但使用存储在数据库中的哈希而不是从密码计算它这种方法有缺点 - 需要存储密码原始或散列无盐。或者使用令牌向客户端发送盐。

  

但是,如果“黑帽子”窃取密码哈希并通过它对服务器api进行身份验证怎么办?

使用将在使用后过期的令牌可以解决此问题。

答案 1 :(得分:1)

执行轻量级哈希客户端(无盐),然后重新散列哈希(使用唯一的salt)服务器端。存储盐和(加倍)哈希密码。

服务器端哈希还应该使用pbkdf2scrypt之类的东西,它可以执行数千次哈希迭代,故意减慢散列过程。这有助于通过减慢攻击过程来防止哈希的暴力攻击。