我有一个存储在数据库中的密码,该数据库是使用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执行此操作但没有结果。
答案 0 :(得分:3)
是的,您可以在Android端重新创建哈希值,但这并不能解决您的加密问题。如果您以明文形式发送哈希,攻击者只需重放哈希值,即可访问您的系统而无需知道密码。
password_hash函数的输出包括实际哈希值之前的算法,成本选项和salt(2y告诉您算法,10是示例中的成本选项)。您需要通过提供这些参数将其输入到Android端的crypt函数中。通常,您只需将整个输出作为crypt函数的输入,但这是您要开始验证的令牌,因此您需要根据您使用的算法仅提取salt所需的部分。
最简单的方法是使用现有的摘要实现,如this,并使用服务器和客户端支持的密码,如CRYPT_SHA256或CRYPT_SHA512。
但重申一下,你应该恰当地使用加密。
答案 1 :(得分:1)
我不明白为什么你需要在你的移动应用程序中重现相同的哈希值,但我想你可以试试这个:
您可以使用其他加密技术从您的移动应用程序发送密码,在您的php服务器中解密并使用password_verify。
我想你的服务器上有一个密码盐,可以使密码更强。
希望有所帮助