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~:)

저작자 표시 비영리 동일 조건 변경 허락
신고

+ Recent posts