Web サイトのアクセスデータを作成しているときに、Java で作成された MD5 暗号化パスワードが PHP MD5 で作成されたものとまったく同じではないことに突然気付きました。ここや他の場所の投稿を見ると、Java で PHP とまったく同じ結果が得られることを保証するいくつかのソリューションが見つかりました。ただし、すべての Java 実装は、それらの間で同じ結果をもたらしますが、PHP によるものとはまったく異なる結果をもたらします。
そのため、PHP による変換のために同じパスワードをローカル サーバーに送信し、同時に Java を使用してそれ自体を変換する小さな Java プログラムを作成しました。ここでプログラム:
public PHPDriver() {
String pwd = "aabbccdd";
String p = encodeByPHP("http://localhost/testsite/md5.php?pwd=" + pwd);
System.out.println("PHPDriver: " + pwd + " -> " + p);
System.out.println("md5: " + pwd + " -> " + md5(p));
...
public String encodeByPHP(String url) {
try {
// create a link to a URL
URL urlAddress = new URL(url);
URLConnection link = urlAddress.openConnection();
BufferedReader inStream = new BufferedReader(new InputStreamReader(link.getInputStream()));
return inStream.readLine();
} catch (MalformedURLException e) {
...
public String md5(String input) {
String result = input;
try {
if(input != null) {
MessageDigest md = MessageDigest.getInstance("MD5"); //or "SHA-1"
md.update(input.getBytes());
BigInteger hash = new BigInteger(1, md.digest());
result = hash.toString(16);
while(result.length() < 32) {
result = "0" + result;
}
}
} catch (NoSuchAlgorithmException nsa) {
そして (圧倒的に複雑です;-) PHP ページ:
<?php
$pwd = $_GET['pwd'];
// echo $pwd . ' -> ';
echo sha1($pwd);
?>
この結果は次のようになります。
PHPDriver: aabbccdd -> 527bee2730bf234e9a78bde5af091ece9c6302d5
md5: aabbccdd -> ab86815613f7f321001efef1935dbe7d
ここで何がうまくいかないのですか?これは誤ったエンコードの問題ですか? また、PHP の結果が通常の 32 文字ではなく 40 文字になるのはなぜですか?