웹 사이트에 대한 액세스 데이터를 준비하면서 갑자기 Java에서 생성 된 MD5 암호화 된 암호가 PHP MD5에서 생성 된 것과 동일하지 않다는 사실을 알고있었습니다. 여기 및 다른 곳에서 게시 된 내용을 살펴보면 Java에서 여러 가지 솔루션을 발견하여 PHP와 정확히 동일한 결과를 얻을 수 있음을 확인했지만 모든 Java 구현은 동일한 결과를 제공하지만 PHP와는 완전히 다른 결과를 제공합니다.Java MD5와 PHP MD5가 완전히 다른 결과를 제공하는 이유는 무엇입니까?
그래서 저는 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 개의 char입니까? 당신의 PHP 스크립트
에서
'sha1'은'md5'가 아닙니다. – datasage
자바 코드가 MD5를 사용하는 동안 PHP 코드가 SHA1 해시 알고리즘을 사용하는 것처럼 보입니다. –
출력의 길이 *에 유의하십시오. SHA-1은 160 비트, 20 바이트, 40 개의 16 진 문자입니다. MD5 128 비트, 16 비트, 32 진수 문자. –