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

MPK*_*ing 5 security passwords hash android

显而易见的答案是散列.我正在考虑使用SHA512来哈希一个盐渍密码.

我的问题是:我应该在哪里哈希密码?

我想过两种方法:

(1)我在应用程序中哈希它.这意味着哈希被传输到服务器.然后,服务器根据存储的哈希检查它,并在哈希匹配时登录用户.

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

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

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

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

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

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

irc*_*ell 6

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

在服务器上哈希密码.

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

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

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

但是,请考虑使用OAuth2Google+登录等联合身份验证,因为它们都会为您处理此问题.


Vas*_*kis 5

让我们从头开始.

  1. 使用加密安全的伪随机数生成器为每个密码填充.
  2. 哈希盐+通过的组合
  3. 同时传输的 散列通过一个加密的, 私人信道
  4. 哈希存储在数据库,文本文件或任何你想要的东西中(数据库有额外的好处,需要额外的身份验证,安全性是层)
  5. 当用户再次输入他们的通道(通过加密 专用通道)时,使用您之前存储的盐,使用相同的算法对其进行哈希处理.
  6. 如果生成的哈希匹配,则对它们进行身份验证,如果没有,请告诉他们他们一切都错了.

是否可以在服务器端生成盐(以确保它是唯一的),然后在密码被盐渍和散列之前发送到客户端?

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

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

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

请记住,如果一个人有密码短或弱,他们的密码仍然可以迅速破解.

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

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

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

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

  • 编写了我对这些问题的回答.顺便问一下好问题. (2认同)