我们目前正在.Net中开发一个Web应用程序,该应用程序还将安装Android,iPhone和Windows Mobile 8应用程序。所有这些应用程序都需要具有统一的登录系统。我们的网站和网络服务将使用SSL,但显然我们希望尽我们所能确保用户密码保持安全。因此,我们正在寻找可在整个上述平台中使用的通用密码散列函数。
目前我们发现的唯一常见的是SAH256但是我想使用更强一些的东西。 C#有我想要使用的Rfc2898DeriveBytes类(并且可以在网站和Win8 Mobile中使用)但是有没有针对Android / Java和iOS / Objective C的任何实现?如果不能使用这将是我们的下一个最佳选择?
答案 0 :(得分:4)
在存储用户密码并在登录尝试期间进行比较时,应在后端使用密码哈希功能。
登录scenerio:
用户通过您应用的某个版本通过SSL发送密码。
后端服务器散列从用户发送的密码,从数据存储中检索存储的散列,将发送的密码的散列与存储的散列进行比较。
哈希匹配,允许用户访问,否则访问被拒绝。
SSL加密可防止在从客户端传输过程中泄露密码,将密码存储为哈希可防止在数据库被破坏时泄露用户密码。
使用此场景,由于散列全部在后端服务器上完成,因此只需要一个哈希算法实现。
答案 1 :(得分:2)
PBKDF2不适合您的情况。它主要用于防止攻击者已拥有您的数据(即加密文件)时的攻击。它通过占用CPU来强制延迟来强制执行此操作。因为您正在执行auth服务器端,所以您可以轻松保存一些CPU,只需等待一两秒即可在客户端输入错误时向客户端发送响应。只需使用盐渍哈希(如HMAC),你就可以了。
如果您使用的是SSL,那么您的密码是安全的。您可以做得更好的唯一方法是实现完整的公钥加密,这可以防止MITM攻击。 SSL甚至内置了这个。
通过网络发送密码哈希并不比发送密码更安全。是的,密码文本对攻击者是隐藏的,但是他们仍然有哈希,如果他们有,他们不需要密码。对于SSL,您的纯文本也受到保护。
答案 2 :(得分:0)