나는 이것에 대해 질문이 있습니다.동일한 값에 대해 클라이언트와 서버에서 서로 다른 sha가 계산되었습니다.
Java로 소켓을 통해 통신하는 두 개의 프로그램, 클라이언트와 서버를 만들었습니다. 이제 서버 소켓의 InputStream에서 객체를받을 때 SHA384를 받아 클라이언트에서 계산 한 SHA384와 동일한 값인지 확인해야합니다. 수신 된 값이 전송 된 값과 같음을 디버그 모드에서 확인했지만이 값의 SHA384를 사용하면 클라이언트와 다른 해시를 얻습니다.
왜? 클라이언트는 안드로이드 응용 프로그램이며 서버 측은 단순한 Java입니다. Strings
를 들어, 시스템의 디폴트 캐릭터 세트를 사용 getBytes()
에 의존 :
이
내가 해시public enum SECURE_HASH_TYPE{MD2, MD5, SHA, SHA256, SHA384, SHA512}
private static String SecureHashToString(SECURE_HASH_TYPE hash){
String hashString = "SHA-256"; //default value
if(hash != null){
switch(hash){
case MD2:
hashString = "MD2";
break;
case MD5:
hashString = "MD5";
break;
case SHA:
hashString = "SHA";
break;
case SHA256:
hashString = "SHA-256";
break;
case SHA384:
hashString = "SHA-384";
break;
case SHA512:
hashString = "SHA-512";
break;
default:
hashString = "SHA-512";
break;
}
}
return hashString;
}
public static byte[] getByteHashCode(Object obj, SECURE_HASH_TYPE hashing){
if(obj == null)
return null;
MessageDigest md;
byte[] byteData = null;
try {
md = MessageDigest.getInstance(SecureHashToString(hashing));
md.update(ObjectUtil.toByteArray(obj));
byteData = md.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return byteData;
}
public static byte[] toByteArray(Object obj){
if(obj == null)
return null;
if(obj instanceof String)
return ((String)obj).getBytes();
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
byte[] byte_array = null;
try{
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
byte_array = baos.toByteArray();
baos.close();
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return byte_array;
}
해시가 다른 경우 텍스트가 다르고 이야기가 끝납니다. 동일한 문자 세트, 인코딩을 사용하고 있는지 확인하고 그 패딩은 동일합니다 ... – ircmaxell
텍스트가 동일합니다. 나는 그것을 검사했다. 동일한 텍스트는 클라이언트 및 서버 측의 BigInteger입니다. – Giulio
* 텍스트 *는 같을 수 있지만 동일한 바이트를 전달하는 바이트입니까? 의미가 100 % 긍정적인가? 다르게 인코딩하지 않습니까? 아니면 하나의 후행 null 바이트, 또는 그런 ...? – ircmaxell