【问题标题】:How to use PHP's password_hash in Android如何在 Android 中使用 PHP 的 password_hash
【发布时间】:2016-02-17 18:16:21
【问题描述】:

我有一个密码存储在数据库中,该密码使用 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 来实现这一点,但没有结果。

【问题讨论】:

  • 您为什么要尝试重现相同的密码哈希?
  • 我需要能够检查密码是否正确,但目前密码正在“明文”发送,我想知道是否有一种方法可以重新创建存储的哈希在数据库中,并对其进行检查
  • 意味着我将发送哈希而不是纯文本密码。要么,要么我可以使用加密,但我找不到足够安全的东西。

标签: android bcrypt php-password-hash


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    PHP password_verify

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

    我认为你的服务器中有一个密码盐,可以使密码更强大。

    希望有帮助

    【讨论】:

    • 我可以使用什么加密算法?我用过谷歌,但没有找到足够安全的东西。
    • 您使用的是 HTTPS 连接吗?这将非常有帮助。你也可以试试this project,看看@mattm 的回答。我今天很着急,但我稍后会尝试在这里发布一些代码,好吗?
    • 这是一个计算 A2 项目,所以不,我没有使用 https 连接
    猜你喜欢
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    相关资源
    最近更新 更多