2

我们目前正在.Net 中开发一个Web 应用程序,它还将拥有Android、iPhone 和Windows Mobile 8 应用程序来占用它。所有这些应用程序都需要有一个统一的登录系统。我们的网站和网络服务将使用 SSL,但显然我们希望尽我们所能确保用户密码的安全。因此,我们正在寻找一种可以在上述平台中使用的通用密码散列函数。

目前我们发现的唯一常见的是 SAH256,但我想使用一些更强大的东西。C# 有我想使用的 Rfc2898DeriveBytes 类(并且可以在网站和 Win8 Mobile 中使用)但是对于 Android/Java 和 iOS/Objective C 是否有任何实现?如果这不能使用,我们的下一个最佳选择是什么?

4

3 回答 3

4

在存储用户密码并在登录尝试期间进行比较时,应在后端使用密码哈希函数。

登录场景:

用户通过您的应用程序版本之一通过 SSL 发送密码。

后端服务器对用户发送的密码进行哈希处理,从数据存储中检索存储的哈希,将发送的密码的哈希与存储的哈希进行比较。

哈希匹配,用户被允许访问,否则访问被拒绝。

SSL 加密可防止在从客户端传输期间泄露密码,将密码存储为哈希可防止在您的数据库遭到破坏时泄露用户密码。

使用这个场景,由于哈希都是在后端服务器完成的,因此只需要一个哈希算法的实现。

于 2012-12-17T15:50:22.917 回答
2

PBKDF2 不适合您的情况。它主要是为了防止攻击者已经拥有您的数据(即加密文件)时的攻击。它通过在暴力破解期间消耗 CPU 来强制延迟来做到这一点。因为您是在服务器端执行身份验证,所以您可以轻松节省一些 CPU,如果客户端密码错误,您只需等待一两秒钟即可向客户端发送响应。只需使用加盐哈希(如 HMAC),就可以了。

如果您使用 SSL,那么您的密码是安全的。您可以做得更好的唯一方法是实施完整的公钥加密,这可以防止 MITM 攻击。SSL 甚至内置了这个。

通过网络发送密码哈希并不比发送密码更安全。是的,密码文本对攻击者是隐藏的,但他们仍然有哈希值,如果他们有,他们就不需要密码。在 SSL 的情况下,您的纯文本也受到保护。

于 2012-12-17T16:01:51.073 回答
0

虽然我从未亲自使用过它,但 bcrypt 似乎拥有您正在寻找的所有实现。

http://en.wikipedia.org/wiki/Bcrypt#See_also

希望有帮助。

于 2012-12-17T15:45:54.480 回答