hash나 MAC, Signature모두 hash를 기본으로 사용하지만 어떤부분이 다른지 살펴본다.
먼저 기본이 되는 hash는 메세지를 요약하는데 사용된다.
byte[] data = "plain text".getBytes("UTF-8");
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(data);
byte[] digest = messageDigest.digest();
MAC은 Message Authentication Code의 약자로 메세지를 인증하는 용도로 생성하는 hash를 말한다.
메세지를 인증하는 방법은 symmetric key를 통해서 hash를 생성하고 수신측에서도 동일한 key를 통해서 hash를 확인할 수 있다.
이를 통해 수신자에서는 메세지 전송자가 확실함을 '인증' 할 수 있다.
String algorithm = "AES";
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
SecureRandom secureRandom = new SecureRandom();
int keyBitSize = 256;
keyGenerator.init(keyBitSize, secureRandom);
SecretKey secretKey = keyGenerator.generateKey();
SecretKeySpec key = new SecretKeySpec(secretKey.getEncoded(), algorithm);
byte[] data = "plain text".getBytes("UTF-8");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(key);
mac.update(data);
byte[] macBytes = mac.doFinal();
Signature 역시 MAC과 같이 메세지를 인증하는 용도로 사용되지만 여기에 재전송하는 경우 제 3의 수신자 역시 원 전송자를 인증할 수 있다.
제 3자도 인증을 할 수 있도록 메세지를 asymmetric key(private key)를 이용해 hash하고 수신측에서는 public key를 통해서 원 전송자를 인증할 수 있고 이 메세지를 제 3자에게 전달하여도 제3자 역시 public key를 통해서 원 전송자를 인증할 수 있다.
SecureRandom secureRandom = new SecureRandom();
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
KeyPair keyPair = keyPairGenerator.generateKeyPair();
Signature signature = Signature.getInstance("SHA256WithDSA");
signature.initSign(keyPair.getPrivate(), secureRandom);
byte[] data = "plain text".getBytes("UTF-8");
signature.update(data);
byte[] digitalSignature = signature.sign();
Happy Coding~:)