如何在Android中使用PHP的password_hash

时间:2016-02-17 18:16:22

标签: android bcrypt php-password-hash

我有一个存储在数据库中的密码,该数据库是使用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执行此操作但没有结果。

2 个答案:

答案 0 :(得分:3)

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

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

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

但重申一下,你应该恰当地使用加密。

答案 1 :(得分:1)

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

PHP password_verify

您可以使用其他加密技术从您的移动应用程序发送密码,在您的php服务器中解密并使用password_verify。

我想你的服务器上有一个密码盐,可以使密码更强。

希望有所帮助