사용자의 정보를 서버에 보내기 위해서 해쉬알고리즘으로 데이터를
으깨기로 했습니다.
수많은 알고리즘 중에서 안드로이드에서 활용하기 쉬운 MD5를 쓰려고 했으나
SHA가 더 좋다는걸 알게 되어 SHA1을 사용했습니다.
public static String sha1(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
messageDigest.update(input.getBytes("UTF-8"), 0, input.length());
byte[] sha1hash = messageDigest.digest();
Log.d("#@#", "" + sha1hash.toString());
return convertToHex(sha1hash);
}
처음에 byte 코드를 new String 으로 만들어서 로그를 찍었습니다.
결과값은 안나오더군요.. 가만히 생각해보니 아스키코드표에 없는
특수문자로 인해서 데이터가 안나올수 있겠다 싶어 toString 으로 확인 했는데...
같은 인풋스트링을 넣었는데 매번 다른 결과값이 나오는것이 확인이 되었습니다.
짜증이 솟구치는 .... 뱅신 안드로이드를 외칠려는 찰나..
아무래도 같은 데이터인데.. 표기하는데 문제가 있지 않나 싶어..
Hex로 변환하기로 했습니다.
인터넷에서 주서온 코드
private static String convertToHex(byte[] data) {
StringBuilder buf = new StringBuilder();
for (byte b : data) {
int halfbyte = (b >>> 4) & 0x0F;
int two_halfs = 0;
do {
buf.append((0 <= halfbyte) && (halfbyte <= 9) ? (char) ('0' + halfbyte) : (char) ('a' + (halfbyte - 10)));
halfbyte = b & 0x0F;
} while (two_halfs++ < 1);
}
return buf.toString();
}
매번 같은 결과가 나타나네요 ㅎ
스트링 검사는 요기에서
http://www.textdiff.com/
08-16 16:34:51.811: D/#@#(8253): [B@43899560 (byte to String)
08-16 16:34:51.811: D/#@#(8253): 0c332ba84de9a2a4e0e84b4ea680769a84104bba (hex convert)
08-16 16:35:00.159: D/#@#(8253): [B@434664f0 ----- > 매번 다른 값이 찍힘 ㅠㅠ
08-16 16:35:00.159: D/#@#(8253): 0c332ba84de9a2a4e0e84b4ea680769a84104bba
lib : apache commons codec
org.apache.commons.codec.digest.DigestUtils
DigestUtils.md5Hex(bytes);
DigestUtils.shaHex(bytes);
이녀석을 이용해도 좋답니다 ^.^
별건아닌데, hex 변환말고 그냥 Base64 로 인코딩해서 테이터를 String 으로 바꿔도 hex 구현 없이 비슷한 용도로 결과가 나올것 같군요.
String base64Str = Base64.encodeToString(bytes, Base64.NO_WRAP);
이런 걸로 안드로이드나 자바를 욕하시면 안됩니다.
byte[] 의 toString() 메소드를 호출해서 나온 값은 byte[] 의 Singnature 와 해쉬넘버입니다.
각각 생성한 별개의 오브젝트이기 때문에 당연히 다른 값이 나옵니다.
다음 조건식이 왜 false 인지 생각해보시기 바랍니다.
new byte[]{ 1 } == new byte[]{ 1 } //false
그리고 덧붙여 byte[] 를 hexstring 으로 변환하기 위해서는 다음의 방법을 사용할 수 있습니다.
String str = new BigInteger( 1, byteArr ).toString( 16 );
좋아요!