我应该在哪里哈希用户密码?

时间:2015-04-21 12:42:50

标签: android security hash passwords

显而易见的答案是哈希。我想用SHA512来哈希一个盐渍密码。

我的问题是:我应该在哪里散列密码?

我想到了两种方式:

(1)我在应用程序中哈希。这意味着哈希被传输到服务器。然后,服务器会根据存储的哈希值对其进行检查,如果哈希值匹配,则会在用户中登录。

(2)我在服务器上散列它。以相同的方式检查哈希。

我的问题是我觉得密码可能会被截获。在(1)中,哈希可以通过中间人攻击来提取。攻击者现在可以简单地使用该哈希来访问用户的信息。

在(2)中,攻击者可以拦截纯文本密码,并使用它来访问用户的帐户。

我需要在双方都散列的解决方案吗?在客户端使用salt散列,然后在服务器端再次散列?

我不知道该怎么办。我不希望访问用户的信息。

如果你也可以指出你的建议的好处,我会很感激。

2 个答案:

答案 0 :(得分:7)

只需使用SSL并以纯文本格式传递密码即可。说真的,只需使用HTTPS。

在服务器上哈希密码。

如果你在客户端上对它进行了哈希处理,那么你很容易受到称为“重放攻击”的攻击,攻击者可以拦截请求,窃取“salt + hash”,然后使用它进行身份验证。

  

在(2)中,攻击者可以拦截明文密码,并使用它来访问用户的帐户。

如果攻击者能够使用MITM攻击SSL,则无论如何都会丢失所有 。除了拦截密码之外,它们可以造成更大的伤害。 (并且它不太可能)

但是,请考虑使用联合身份验证,例如OAuth2Google+ Sign-in,因为它们都会为您处理此问题。

答案 1 :(得分:5)

让我们从头开始。

  1. 为每个密码using a cryptographically secure pseudo-random number generator加盐。
  2. 哈希盐+传递
  3. 的组合
  4. 通过加密 <传输 salt 哈希 strong>私人频道
  5. salt 哈希存储在数据库或文本文件中,或将您想要的任何内容(数据库还需要额外的身份验证,安全性是层
  6. 当用户再次输入传递时(通过加密 私有频道),您可以使用相同的算法对其进行哈希处理你早先储存的盐。
  7. 如果生成的哈希值匹配,则会对其进行身份验证,如果没有,请告诉他们他们一切都错了。
  8.   

    可以在服务器端生成盐(以确保它是唯一的),然后在密码被哈希并进行哈希处理之前发送到客户端吗?

    您应该绝对执行salting服务器端以确保您可以最大程度地控制此过程。绝不允许用户,客户或设备自己制作盐。

      

    是否可以使用salt和hash来访问用户的帐户?加密通道是否意味着防止任何中间人攻击?

    如果某人获得了所有存储的哈希值和盐的访问权限,他们可能会尝试进行暴力破解/字典攻击以尝试获取匹配的哈希值,但是他们只能非常缓慢地执行它们,因为每个哈希都有不同的哈希值盐

    请记住,如果一个人的密码有短或弱,他们的密码仍可能很快破解。

    如果它们都含有相同的盐,当它们破裂时,它们基本上会破坏所有盐。

    加密通道是为了防止人们收听客户端和服务器之间的通信。它不能保证它会阻止MITM攻击,但它应该增加一层保护,因为MITM无法验证自己作为您/您的组织。

      

    如何确保Android应用和Google App Engine之间的频道安全?

    这取决于它在网上吗?使用HTTPS并使用SSL证书验证您的应用程序,如果它在您的预算范围内,则使用扩展验证。