【问题标题】:How to have the same password compatible with both java and php?如何使相同的密码同时兼容 java 和 php?
【发布时间】:2014-01-24 01:38:48
【问题描述】:

我已经使用 PHP crypt 函数对密码进行哈希处理。 例如:

<?php

$hash = '$2y$08$ffWmSGZOM5pNJpHNvpqMa.z01BL25WGoXViaWYhxS0WRaftgAxhkC';
$test = crypt("test", $hash);
$pass = $test == $hash;

echo "Test for functionality of compat library: " . ($pass ? "Pass" : "Fail");
echo "\n";

现在: 如果我使用 php bcrypt password_hash() 函数,我会得到以下输出:

密码:测试

使用password_hash() 的加密密码是: $2y$08$ffWmSGZOM5pNJpHNvpqMa.z01BL25WGoXViaWYhxS0WRaftgAxhkC

现在我想在 Android Java 中获得相同的输出。 我的问题是:

  1. 我怎样才能做到这一点?
  2. android java中是否有任何类文件或默认函数可以用来实现这一点?
  3. 我必须编写自定义函数来实现这一点吗?

我也想用java解密密码。

任何带有示例的答案将不胜感激。提前谢谢大家。

【问题讨论】:

  • 首先,如果您使用相同的散列算法,则返回相同的语言并不重要。其次,你不能真正取消哈希。
  • 您不能取消散列哈希,您只能将一个哈希与另一个匹配。如果您可以使用更改后的密码“取消”某些内容,那么您就是在解密它,这意味着它是加密文本,而不是散列。
  • 您好 jonast92,感谢您的回复。但这与我的问题没有任何意义!?
  • 如果您对该主题有误解,那么只要我不将其作为答案发布就值得发表评论,即使它不是您知道的问题的解决方案,如果它可能是一个解决方案对于您不知道的问题,在这种情况下是散列和加密的含义。无论如何,我看不出答案中没有答案;他们是,如果您使用完全相同的算法,那么您将获得匹配的哈希值,这就是您想要的,您是否尝试过使用相同的算法但使用不同的语言创建哈希值,然后匹配结果?
  • 您好 Jonast92 ..感谢您的回复。请查看此段:“现在:如果我使用 php bcrypt passowrd_hash() 函数,我会得到以下输出:密码:使用 passowrd_hash() 测试 bcrypted 密码是:$2y$08$ffWmSGZOM5pNJpHNvpqMa.z01BL25WGoXViaWYhxS0WRaftgAxhkC”。我在 php 中使用 bcrypt 算法。我想在java中相同。那么我怎样才能在 Java 中实现同样的效果!?

标签: java php android


【解决方案1】:

我正在使用 bcrypt 的 laravel 默认密码哈希算法。 我的问题是将其转换为与 Java 相同。我已经使用 jbcrypt 获得了相同的密码。 例如:

这里 laravel bcrypted 密码是 = "$2y$08$rW76CEOBYmWzeANFqNOQyei8ArmYpacN6MIRjS55sgpT.6p/5eMv。" 我已将该字符串放入变量中

String a_hash = "$2y$08$rW76CEOBYmWzeANFqNOQyei8ArmYpacN6MIRjS55sgpT.6p/5eMv.";

下面的代码给了我匹配的密码结果:

if (BCrypt.checkpw(candidate, a_hash))
            System.out.println("It matches");
        else
            System.out.println("It does not match");

我使用 Damien Miller 的 BCrypt 库来实现这一点。 这些是有用的网址: http://www.mindrot.org/projects/jBCrypt/

Using jBCrypt to salt passwords in Android App causes a long hang

Using jBCrypt to salt passwords in Android App causes a long hang

【讨论】:

  • 我尝试了您的解决方案,但提出了无效的盐修订版
【解决方案2】:

如果你坚持在 Java 中使用 bcrypt。试试这个,jBCrypt

【讨论】:

    【解决方案3】:

    首先,我们需要看看 PHP 中的 crypt 函数是做什么的。 php.net states:

    "crypt() 将使用基于标准 Unix DES 的散列字符串返回 上可用的算法或替代算法 系统。”

    假设它是 DES,即使 DES 不是散列算法。

    好的,现在我们知道了使用什么“散列”函数,这只是用另一种语言实现它的一个例子(暂时撇开迂腐,散列函数应该总是在给定相同输入的情况下返回相同的输出)。

    这里是一个链接,展示了如何在 Java 中实现 DES:http://www.mkyong.com/java/jce-encryption-data-encryption-standard-des-tutorial/

    除此之外,DES 被严重破坏,应该避免使用。至少我会推荐 SHA-2 用于散列。此外,您不能(再次,抛开迂腐)“解密”散列,因为散列函数是一种方法。

    【讨论】:

    • 您好 DHT,感谢您的回复。但它没有给我任何与我的问题相关的明确答案!?我想为 php 和 java 使用相同的密码!我该怎么做?
    猜你喜欢
    • 2012-04-22
    • 2015-10-15
    • 1970-01-01
    • 2016-10-15
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多