Java中PHP的crypt函数的等价物

时间:2010-07-20 16:26:14

标签: java php encryption

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

修改1 : 这是我加密密码的PHP代码:

$ password =“test123”;
$ pwd = crypt($ password,$ password);
echo $ 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();
            }

7 个答案:

答案 0 :(得分:11)

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

例如,您可以致电

UnixCrypt.crypt(string, salt)

OR

Md5Crypt.md5Crypt(byte[], salt)

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

答案 1 :(得分: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());

答案 2 :(得分:2)

您似乎必须使用已填充了无法丢弃的密码的旧数据库,因此您不能只使用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来获取选项列表。

答案 3 :(得分:1)

你需要看看java.security类(曾经是JCE的东西):

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

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

e.g。适用于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/

答案 4 :(得分:1)

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

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

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我可以推荐这个: MD5Crypt implementation

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

这是少数几个适合我的实现之一。