【问题标题】:Equivalent of PHP's crypt function in Java等价于Java中PHP的crypt函数
【发布时间】:2011-03-18 13:20:24
【问题描述】:

我正在将我的 PHP 代码迁移到 Google App Engine - Java。
所以我需要一个等效于 Java 中 PHP 的 crypt 函数,
因为我已经存储了所有注册用户的密码
在我的数据库中使用 crypt。

编辑 1: 这是我用于加密密码的 php 代码:

$password = "test123";
$pwd = crypt($password,$password);
回声 $pwd;

输出是(在 Windows 以及 HostMonser 上基于 linux 的服务器上):
temjCCsjBECmU

谁能给我等效的java代码?
我尝试了各种排列和组合
MessageDigest 类,但无法正确处理..

编辑 2
这是我认为可行但没有用的示例代码:

try {
                {
                    String password = "test123";
                    MessageDigest digest = MessageDigest.getInstance( "MD5" ); 
                    byte[] passwordBytes = password.getBytes( ); 

                    digest.reset( );
                    digest.update( passwordBytes );
                    digest.update( passwordBytes );
                    byte[] message = digest.digest( );

                    StringBuffer hexString = new StringBuffer();
                    for ( int i=0; i < message.length; i++) 
                    {
                        hexString.append( Integer.toHexString(
                            0xFF & message[ i ] ) );
                    }
                    String encrypted = hexString.toString();
                    System.out.println(encrypted);
                  } } catch (NoSuchAlgorithmException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

【问题讨论】:

  • 请告诉我您没有使用默认 (DES) crypt 算法....现代 unixen 不附带 crypt 实用程序是有原因的——它以前被破坏过。
  • @Billy ONeal:PHP 的默认设置取决于操作系统。在 Linux/BSD 上,它默认为 salted MD5(非常旧的版本除外)。较新的版本甚至可能使用较新的方案,例如盐渍 SHA512。
  • @Billy ONeal:但是,dta just 发布的代码确实是 DES……必须在 PHP 5.2 或更低版本的 Windows 机器上。
  • 对于 MessageDigest 类,您不能调用 update() 方法两次。它导致加密密码“test123test123”而不是“test123”。
  • 我调用了它两次,因为我认为它会处理“盐”,就像 PHP 的 crypt 一样。

标签: java php encryption


【解决方案1】:

这是一个旧线程,但我遇到了同样的问题并找到了不同的解决方案。您可以使用Apache Commons Codec 1.7 库中的UnixCrypt/Md5Crypt 类。

例如你可以调用

UnixCrypt.crypt(string, salt)

Md5Crypt.md5Crypt(byte[], salt)

我没有研究其他加密类型,但我想它们也是其他实用程序。

【讨论】:

    【解决方案2】:

    您必须知道使用了哪种 PHP crypt 实现(MD5?SHA256?SHA512?),因为有几个,具体取决于您的操作系统:http://php.net/manual/fr/function.crypt.php

    Java 等效类是MessageDigest。当你创建这个类的实例时,你提供了哈希算法,例如:

    MessageDigest md = MessageDigest.getInstance("MD5");
    MessageDigest md2 = MessageDigest.getInstance("SHA-256");
    MessageDigest md3 = MessageDigest.getInstance("SHA-512");
    // etc.
    byte[] encryptedPassword = md.digest("yourPassword".getBytes());
    

    【讨论】:

    • PHP 手册页是法语、英语版本:php.net/manual/en/function.crypt.php
    • 对不起。感谢您的更正。由于我是法国人,所以我在发布回复时没有注意到。
    • 用加密密钥加密怎么样?有什么方法可以在 java 中使用 crypt 密钥,就像在 php 中一样?例如 crypt($password, "test") 的加密方式与 php 中的 crypt($password) 不同...
    • 不一样的:PHP中的crypt()是Crypt3的封装en.wikipedia.org/wiki/Crypt_(C)和digest不一样,它做了很多迭代
    【解决方案3】:

    您似乎必须使用已经填充了您无法丢弃的密码的旧数据库,因此您不能只使用switch to a salted MessageDigest,最好使用 SHA-1。而且您的问题变得更加复杂,因为 PHP 的 crypt 是 might use one of several algorithms 的包装器。但是让我们假设您的 PHP 使用原始的基于 DES 的 UNIX crypt,那么您所需要的只是用 Java 实现它。据我所知,标准 Java 安装中没有 UNIX 的 crypt 实现,但您可能想look here 获取选项列表。

    【讨论】:

      【解决方案4】:

      您需要查看 java.security 类(以前是 JCE):

      在那里,你会找到做你想做的一切所需的一切(取决于你需要的算法)。

      http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/security/package-summary.html

      例如MD5/SHA 等的 MessageDigest:

      http://download.oracle.com/docs/cd/E17409_01/javase/6/docs/api/java/security/MessageDigest.html

      在此处对照 Google App Engine 白名单检查这些内容,我不确定哪些支持,哪些不支持。

      http://code.google.com/appengine/docs/java/jrewhitelist.html

      java.security 有时使用起来有点麻烦,您可能还想使用 Jasypt - 这是一个更简化的 API,可与任何 JCE 一起使用:

      http://www.jasypt.org/

      【讨论】:

        【解决方案5】:

        PHP 的 crypt 支持多种散列函数。如果你使用 MD5 版本(hash 以 $1$ 开头),你可以在这里找到一个 Java 实现,

        http://www.java2s.com/Open-Source/Java-Document/Groupware/LibreSource/md5/MD5Crypt.java.htm

        请注意他们使用自己的 MD5 类。我不确定它是否与标准 MD5 相同。

        我相信您也可以找到其他哈希算法的 Java 实现。

        【讨论】:

          【解决方案6】:

          嗯,据我所知,PHP 的 crypt 实际上并不是加密。它只是我相信的一些单向散列函数的包装器,所以如果您当前的 PHP 站点使用 crypt 的 MD5 或 SHA256 或其他什么,我希望您可以在 Java 中找到那些等效的散列类/函数。

          【讨论】:

            【解决方案7】:

            我可以推荐这个:MD5Crypt implementation

            MD5Crypt.crypt("youPassword"); // output: $1$zSiw0koU$i3Srfmoxx4VPePJHWqAuK/
            

            这是少数几个对我有用的实现之一。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-06-08
              • 1970-01-01
              • 2010-09-27
              • 2011-11-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-02
              相关资源
              最近更新 更多