我应该在哪里散列用户密码?
Where should I hash user passwords?
显而易见的答案是散列。我正在考虑使用 SHA512 来散列加盐密码。
我的问题是:我应该在哪里散列密码?
我想到了两个办法:
(1) 我在应用程序中对其进行哈希处理。这将意味着哈希被传输到服务器。然后服务器根据存储的哈希值检查它,如果哈希值匹配则用户登录。
(2) 我在服务器上散列它。以相同的方式检查散列。
我的问题是我觉得密码可能会被拦截。在 (1) 中,可以通过中间人攻击提取哈希。攻击者现在可以简单地使用该哈希来访问用户的信息。
在(2)中,攻击者可以拦截明文密码,并使用它来获得对用户帐户的访问权限。
是我需要两边哈希的解决方案吗?在客户端用盐散列,然后在服务器端再次散列?
我不确定如何进行。我不希望用户的信息被访问
如果您也能指出您的建议的好处,我将不胜感激。
让我们从头开始。
- 对每个密码加盐 using a cryptographically secure pseudo-random number generator。
- 散列salt+pass的组合
- 通过 加密、或 私有频道
- 同时将 salt 和 hash 存储在数据库或文本文件中,或 无论你想要什么(数据库有额外的好处,需要额外的身份验证,安全是层)
- 当用户再次输入他们的通行证时(通过加密或私人频道) ,您使用相同的算法对其进行哈希处理,使用您之前存储的盐。
- 如果生成的哈希值匹配,则他们通过了身份验证,如果不匹配,则告诉他们他们弄错了。
Can the salt be generated server-side (to ensure it's unique) then sent to the client, before the password is salted and hashed?
您绝对应该在服务器端执行加盐,以确保您可以最大程度地控制此过程。绝不允许用户、客户端或设备自己制作盐。
Could the salt and hash be used to gain access to a user's account? Is the encrypted channel meant to prevent any man-in-the-middle attacks?
如果有人可以访问所有存储的哈希和盐,他们可以尝试进行 bruteforce/dictionary 攻击以尝试获得匹配的哈希,但他们只能非常缓慢地进行,因为每哈希有不同的盐。
请记住,如果一个人的密码很短或很弱,他们的密码仍然可以很快被破解。
如果他们都吃同样的盐,当他们破解一个时,他们基本上破解了所有盐。
加密通道是为了防止别人窃听客户端和服务器之间的通信。它不保证它会阻止 MITM 攻击,但它应该增加一层保护,因为 MITM 无法验证自己是 you/your 组织。
How do I ensure that the channel between my android app and Google App Engine is secure?
视情况而定,是通过网络进行的吗?使用 HTTPS 并使用 SSL 证书验证您的应用程序,如果在您的预算范围内,则使用扩展验证。
只需使用 SSL 并以纯文本形式传递密码。说真的,就用 HTTPS 吧。
在服务器上散列密码。
如果您在客户端对其进行哈希处理,您很容易受到称为 "replay attack" 的影响,攻击者可以在其中拦截请求,窃取 "salt + hash",然后使用它进行身份验证。
In (2), the attacker can intercept the plain-text password, and use that to gain access to the user's account.
如果攻击者能够使用 MITM 攻击 SSL,那么一切都会丢失无论如何。他们可以造成比仅仅拦截密码更大的破坏。 (而且可能性很小)
但是,请考虑使用 OAuth2 or Google+ Sign-in 等联合身份验证,因为两者都会为您处理。
显而易见的答案是散列。我正在考虑使用 SHA512 来散列加盐密码。
我的问题是:我应该在哪里散列密码?
我想到了两个办法:
(1) 我在应用程序中对其进行哈希处理。这将意味着哈希被传输到服务器。然后服务器根据存储的哈希值检查它,如果哈希值匹配则用户登录。
(2) 我在服务器上散列它。以相同的方式检查散列。
我的问题是我觉得密码可能会被拦截。在 (1) 中,可以通过中间人攻击提取哈希。攻击者现在可以简单地使用该哈希来访问用户的信息。
在(2)中,攻击者可以拦截明文密码,并使用它来获得对用户帐户的访问权限。
是我需要两边哈希的解决方案吗?在客户端用盐散列,然后在服务器端再次散列?
我不确定如何进行。我不希望用户的信息被访问
如果您也能指出您的建议的好处,我将不胜感激。
让我们从头开始。
- 对每个密码加盐 using a cryptographically secure pseudo-random number generator。
- 散列salt+pass的组合
- 通过 加密、或 私有频道
- 同时将 salt 和 hash 存储在数据库或文本文件中,或 无论你想要什么(数据库有额外的好处,需要额外的身份验证,安全是层)
- 当用户再次输入他们的通行证时(通过加密或私人频道) ,您使用相同的算法对其进行哈希处理,使用您之前存储的盐。
- 如果生成的哈希值匹配,则他们通过了身份验证,如果不匹配,则告诉他们他们弄错了。
Can the salt be generated server-side (to ensure it's unique) then sent to the client, before the password is salted and hashed?
您绝对应该在服务器端执行加盐,以确保您可以最大程度地控制此过程。绝不允许用户、客户端或设备自己制作盐。
Could the salt and hash be used to gain access to a user's account? Is the encrypted channel meant to prevent any man-in-the-middle attacks?
如果有人可以访问所有存储的哈希和盐,他们可以尝试进行 bruteforce/dictionary 攻击以尝试获得匹配的哈希,但他们只能非常缓慢地进行,因为每哈希有不同的盐。
请记住,如果一个人的密码很短或很弱,他们的密码仍然可以很快被破解。
如果他们都吃同样的盐,当他们破解一个时,他们基本上破解了所有盐。
加密通道是为了防止别人窃听客户端和服务器之间的通信。它不保证它会阻止 MITM 攻击,但它应该增加一层保护,因为 MITM 无法验证自己是 you/your 组织。
How do I ensure that the channel between my android app and Google App Engine is secure?
视情况而定,是通过网络进行的吗?使用 HTTPS 并使用 SSL 证书验证您的应用程序,如果在您的预算范围内,则使用扩展验证。
只需使用 SSL 并以纯文本形式传递密码。说真的,就用 HTTPS 吧。
在服务器上散列密码。
如果您在客户端对其进行哈希处理,您很容易受到称为 "replay attack" 的影响,攻击者可以在其中拦截请求,窃取 "salt + hash",然后使用它进行身份验证。
In (2), the attacker can intercept the plain-text password, and use that to gain access to the user's account.
如果攻击者能够使用 MITM 攻击 SSL,那么一切都会丢失无论如何。他们可以造成比仅仅拦截密码更大的破坏。 (而且可能性很小)
但是,请考虑使用 OAuth2 or Google+ Sign-in 等联合身份验证,因为两者都会为您处理。