Java中与PHP的crypt函数等效的功能是什么?

15

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

Edit 1: 以下是我用于加密密码的PHP代码:

$password = "test123";
$pwd = crypt($password,$password);
echo $pwd;

输出结果如下(在Windows和基于HostMonster 的Linux服务器上):
temjCCsjBECmU

有人能提供相应的Java代码吗?
我已经尝试使用MessageDigest类进行各种排列组合,但无法正确实现。

Edit 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();
            }

1
请问您是否在使用默认的DES加密算法……现代Unix系统没有提供crypt实用程序,原因是它曾经被攻破过。 - Billy ONeal
@Billy ONeal:PHP的默认设置取决于操作系统。在Linux/BSD上,默认为加盐MD5(除非是旧版本)。新版本甚至可能使用更新的方案,如加盐SHA512。 - Powerlord
@Billy ONeal:然而,dta刚刚发布的代码确实是DES...必须在安装有PHP 5.2或更低版本的Windows机器上运行。 - Powerlord
使用MessageDigest类时,不要调用update()方法两次。否则会将密码“test123test123”加密而不是“test123”。 - Benoit Courtine
我调用了它两次,因为我认为这样可以处理“salt”,就像PHP的crypt函数一样。 - simplfuzz
你不会使用明文密码作为盐值,对吧? - wallenborn
7个回答

12

5
您需要知道使用了哪种 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手册页面是法语的,英文版本在这里:http://php.net/manual/en/function.crypt.php - Powerlord
1
对不起,感谢您的纠正。由于我是法国人,在发布回复时没有注意到。 - Benoit Courtine
1
使用加密密钥进行加密如何?是否有办法在Java中像在PHP中一样使用加密密钥?例如,在PHP中,crypt($ password,“test”)将加密不同于crypt($ password)。 - Marko Cakic
1
这不是一回事:PHP中的crypt()是Crypt3的包装器,参见https://en.wikipedia.org/wiki/Crypt_(C)。它与digest不同,它进行了许多迭代。 - Sergey Ponomarev

2
看起来你需要使用一个已经填充了无法丢弃的密码的遗留数据库,因此你不能仅仅切换到带盐的 MessageDigest(最好使用 SHA-1)。而且你的问题变得更加复杂,因为 PHP 的 crypt 是一个包装器,可能使用多种算法。但是假设你的 PHP 使用原始的基于 DES 的 UNIX crypt,那么你所需要的就是在 Java 中实现这个功能。据我所知,在标准的 Java 安装中没有 UNIX 的 crypt 实现,但你可以在这里查看选项列表。

1
你需要查看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中的安全问题有时可能会让人感到烦恼,你可以考虑使用Jasypt——这是一个更简化的API,适用于任何JCE。

http://www.jasypt.org/


1

0

PHP 的 crypt 函数实际上并不是加密,而只是一些单向哈希函数的封装。如果你的 PHP 网站当前使用了 crypt 的 MD5 或 SHA256 等函数,我相信你可以在 Java 中找到这些等效的哈希类/函数。


0
我可以推荐这个:MD5Crypt实现

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

这是我使用过的为数不多的实现之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接