将密码加密从java转换为php
我正在尝试创建现有 JSP 程序的 PHP 版本,但是我陷入了密码加密部分。
你能告诉我如何转换这个吗?我知道它尝试获取 md5() 但之后我就没有得到它。我迷失在 Stringbuffer 和 for() 部分。
你能帮我一下吗?
public static String encryptPassword( String password )
{
String encrypted = "";
try
{
MessageDigest digest = MessageDigest.getInstance( "MD5" );
byte[] passwordBytes = password.getBytes( );
digest.reset( );
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 ] ) );
}
encrypted = hexString.toString();
}
catch( Exception e ) { }
return encrypted;
}
I'm trying to create a PHP version of an existing JSP program, however I'm stuck at the password encryption part.
Could you please tell me how to convert this one? I know it tries to get the md5() but after that, I don't get it. I get lost in the Stringbuffer and for() parts.
Can you help me out?
public static String encryptPassword( String password )
{
String encrypted = "";
try
{
MessageDigest digest = MessageDigest.getInstance( "MD5" );
byte[] passwordBytes = password.getBytes( );
digest.reset( );
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 ] ) );
}
encrypted = hexString.toString();
}
catch( Exception e ) { }
return encrypted;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
伊拉克利斯应该是对的。默认情况下,
md5()
为您提供十六进制编码的输出字符串。您只能像在 Java 中那样通过为可选的$raw_output
参数传入TRUE
来获取未编码的字节。那么你的 Java 代码有一个错误。 MD5 哈希值始终为 128 位(32 个十六进制数字)。就是这样:
这将为 16 以下的所有字节生成
1
而不是01
。您存储的是一个损坏的哈希值,您无法从中恢复原始 MD5 值。如果您绝对必须保留这些损坏的数据,则必须在 PHP 中重现该错误:Iraklis should be right.
md5()
gives you a hex-encoded output string by default. You only get the unencoded bytes like in Java by passing inTRUE
for the optional$raw_output
argument.Then your Java code has a bug. MD5 hashes are always 128 bits (32 hex digits). Here it is:
this will generate
1
instead of01
for all bytes below 16. What you have stored is a mangled hash, from which you cannot recover the original MD5 value. If you absolutely must keep this broken data, you will have to reproduce the bug in PHP:它将 MD5 哈希值转换为字符最低有效字节的字符串十六进制数字。在 Java 中,所有字符都是 2 个字节。
实际上,这仅意味着 ASCII 值。
It converts the MD5 hash to a string hexadecimal numbers of the least significan byte of the character. In Java all chars are 2 bytes.
In practice this means just the ASCII value.
更新:
两个版本之间存在一些差异。要解决此问题,请参阅 @bobince 答案。这是测试代码:
Java
PHP
输出:
UPDATE:
There are some discrepancies between the two versions. To fix this see @bobince answer.Here is the test code:
Java
PHP
output:
为了在 java 和 php 中获得相同的结果,我使用了这个。
Java(确保在“try”块内调用该方法):
PHP:
希望这有帮助
编辑:如果java变体返回31个字符,则在字符串前面添加一个“0”以匹配返回32个字符的php哈希。
To get the same results in both java and php I used this.
Java(make sure to call the method inside a "try" block):
PHP:
Hope this helps
Edit: If the java variant returns 31 characters, adds a "0" in front of the string to match the php hash which returns 32 characters.