显而易见的答案是哈希。我想用SHA512来哈希一个盐渍密码。
我的问题是:我应该在哪里散列密码?
我想到了两种方式:
(1)我在应用程序中哈希。这意味着哈希被传输到服务器。然后,服务器会根据存储的哈希值对其进行检查,如果哈希值匹配,则会在用户中登录。
(2)我在服务器上散列它。以相同的方式检查哈希。
我的问题是我觉得密码可能会被截获。在(1)中,哈希可以通过中间人攻击来提取。攻击者现在可以简单地使用该哈希来访问用户的信息。
在(2)中,攻击者可以拦截纯文本密码,并使用它来访问用户的帐户。
我需要在双方都散列的解决方案吗?在客户端使用salt散列,然后在服务器端再次散列?
我不知道该怎么办。我不希望访问用户的信息。
如果你也可以指出你的建议的好处,我会很感激。
答案 0 :(得分:7)
只需使用SSL并以纯文本格式传递密码即可。说真的,只需使用HTTPS。
在服务器上哈希密码。
如果你在客户端上对它进行了哈希处理,那么你很容易受到称为“重放攻击”的攻击,攻击者可以拦截请求,窃取“salt + hash”,然后使用它进行身份验证。
在(2)中,攻击者可以拦截明文密码,并使用它来访问用户的帐户。
如果攻击者能够使用MITM攻击SSL,则无论如何都会丢失所有 。除了拦截密码之外,它们可以造成更大的伤害。 (并且它不太可能)
但是,请考虑使用联合身份验证,例如OAuth2或Google+ Sign-in,因为它们都会为您处理此问题。
答案 1 :(得分:5)
让我们从头开始。
可以在服务器端生成盐(以确保它是唯一的),然后在密码被哈希并进行哈希处理之前发送到客户端吗?
您应该绝对执行salting服务器端以确保您可以最大程度地控制此过程。绝不允许用户,客户或设备自己制作盐。
是否可以使用salt和hash来访问用户的帐户?加密通道是否意味着防止任何中间人攻击?
如果某人获得了所有存储的哈希值和盐的访问权限,他们可能会尝试进行暴力破解/字典攻击以尝试获取匹配的哈希值,但是他们只能非常缓慢地执行它们,因为每个哈希都有不同的哈希值盐
请记住,如果一个人的密码有短或弱,他们的密码仍可能很快破解。
如果它们都含有相同的盐,当它们破裂时,它们基本上会破坏所有盐。
加密通道是为了防止人们收听客户端和服务器之间的通信。它不能保证它会阻止MITM攻击,但它应该增加一层保护,因为MITM无法验证自己作为您/您的组织。
如何确保Android应用和Google App Engine之间的频道安全?
这取决于它在网上吗?使用HTTPS并使用SSL证书验证您的应用程序,如果它在您的预算范围内,则使用扩展验证。