안드로이드에서 SHA-1과 HMAC hash를 위한 class를 만들어 봤습니다.
역시 구글신은 위대합니다…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
public class Hash { /** * 16진수를 문자열로 변환 * @param data 변환할 16진수 * @return 변환된 16진수 문자열 */ 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(); } /** * 문자열의 SHA-1 해쉬값 얻기 * @param text SHA-1 해쉬값을 얻어올 문자열 * @return text 의 SHA-1 해쉬 String */ public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException { MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(text.getBytes("iso-8859-1"), 0, text.length()); byte[] sha1hash = md.digest(); return convertToHex(sha1hash); } /** * 문자열의 HMAC 해쉬값 얻기 * @param type 사용할 HMAC 알고리즘 ("HmacSHA1") * @param value HMAC 해쉬값을 얻어올 문자열 * @param key HMAC 해쉬값 생성에 필요한 key * @return value 의 HMAC 해쉬 String */ public static String HMAC(String type, String value, String key) throws NoSuchAlgorithmException, InvalidKeyException{ javax.crypto.Mac mac = javax.crypto.Mac.getInstance(type); javax.crypto.spec.SecretKeySpec secret = new javax.crypto.spec.SecretKeySpec(key.getBytes(), type); mac.init(secret); byte[] digest = mac.doFinal(value.getBytes()); StringBuilder sb = new StringBuilder(digest.length*2); String s; for (byte b : digest){ s = Integer.toHexString(b&0xFF); if(s.length() == 1) sb.append('0'); sb.append(s); } return sb.toString(); } } |