2

我有一个存储在数据库中的密码,该密码是使用 PHP 的password_hash散列算法加密的。

例子:

password_hash("pass", PASSWORD_DEFAULT);

会产生哈希:

$2y$10$3e6a/J0xDd1LONdnbkp5nud.WwS3.gV3aHBTYX6r4Bq2BxZTjDCZu 

来自 PHP 的文档:

PASSWORD_DEFAULT -使用 bcrypt 算法(默认为 PHP 5.5.0)。请注意,此常量旨在随着 PHP 中添加新的和更强大的算法而随时间而变化。因此,使用此标识符的结果长度可能会随时间而变化。因此,建议将结果存储在可以扩展超过 60 个字符的数据库列中(255 个字符将是一个不错的选择)。

PASSWORD_BCRYPT - 使用 CRYPT_BLOWFISH 算法创建散列。这将使用“$2y$”标识符生成标准 crypt() 兼容哈希。结果将始终是 60 个字符的字符串,或者失败时为 FALSE。支持的选项:

正如它所说的那样,它使用 bcrypt 算法,是否有一种方法可以在我的 android 应用程序客户端中生成上面显示的相同哈希?

我曾尝试使用jBcrypt来实现这一点,但没有结果。

4

2 回答 2

3

是的,您可以在 Android 端重新创建哈希,但这并不能解决您的加密问题。如果您以明文形式发送散列,攻击者可以简单地重放散列,并且无需知道密码即可访问您的系统。

password_hash 函数的输出包括算法、成本选项和实际哈希之前的盐(2y 告诉您算法,10 是示例中的成本选项)。您需要通过提供这些参数将其输入到 Android 端的 crypt 函数中。通常,您只需将整个输出作为 crypt 函数的输入提供,但这是您尝试验证的令牌,因此您只需根据您使用的算法使用盐提取所需的部分。

最简单的方法是使用这样的现有摘要实现并使用服务器和客户端支持的密码,如 CRYPT_SHA256 或 CRYPT_SHA512。

但重申一下,您应该正确使用加密。

于 2016-02-24T20:36:49.480 回答
1

我不明白为什么你需要在你的移动应用程序中重现相同的哈希,但我想你可以试试这个:

PHP 密码验证

您可以使用另一种加密从您的移动应用程序发送密码,在您的 php 服务器中对其进行解密并使用 password_verify。

我指望您的服务器中有一个密码盐,以使密码更强大。

希望有帮助

于 2016-02-24T19:52:20.333 回答