달력

3

« 2024/3 »

  • 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

'Sha'에 해당되는 글 1

  1. 2015.04.29 Java에서 SHA 기반 해시암호화 1
2015. 4. 29. 23:03

Java에서 SHA 기반 해시암호화 Java2015. 4. 29. 23:03

  원래부터 중요하긴 하지만 요 몇 년새에 각종 보안사고(포털/금융기관 등에서의 개인정보 유출 등)가 많이 발생하면서 보안에 대해서 많이 깐깐해지고 있습니다.
그래도 외부에 공개되는 사이트의 경우는 좀 신경쓰고 있지만 내부 시스템의 경우는 비교적 최근까지 BASE64 기반 "인코딩"을 하고 나서 암호화라고 하는 곳도 봤고 심하면 아예 패스워드를 눈에 보이게 그대로 저장하는 케이스까지 있었습니다.


  그런데 이제는 구체적으로 암호화의 방법에 대해서 최소 256bit 이상으로 해야 하네, 패스워드는 복호화가 불가능하게 해시 암호화를 해야 하네 등등 가이드가 나오고 있습니다.  좋은 방향이죠...


  원래 암호화라는게 수학, 특히 정수론 등의 상당히 복잡한 이론에 기반한 내용이라 아무나 쉽게 접근할 수 없는 내용이지만 그래도 요즘에는 효율적인 암호화 알고리즘들이 라이브러리화되어 쉽게 사용할 수 있도록 제공되고 있어 내부적인 알고리즘까지는 알지 못하더라도 사용하기는 쉽게 제공되고 있습니다.


  이번에는 그 중에서 먼저 복호화가 불가능한 방식인 해시암호화, 그 중 대표적인 SHA 기반 암호화에 대해서 적어보려고 하는데 구체적인 내용까지는 모르더라도 해시암호화가 뭔지, 복호화가 가능한 암호화와 무엇이 다른지 등등 기본적인 내용은 알아야 상황에 따라서 잘 사용할 수 있겠죠..
암호화 알고리즘을 검토할 때 상당히 도움이 되었던 사이트가 있어서 소개드리니 기본적인 내용은 아시는 분들이라도 먼저 간단하게 내용을 한 번 보고 오기 바랍니다.  해시 암호화 위주의 설명이긴 하지만


안전한 패스워드 저장


  위 사이트에서 나온 부분 중 대표적인 해시 암호화 함수인 SHA- 계열을 Java에서 구현하는 방법을 기술한다.  Oracle(구 Sun)의 1.6 이상 JVM이면 다 지원됩니다(IBM의 JVM에서도 확인).



  SHA(위키피디아)는 Secure Hash Algorithm의 약자로 기존에 많이 사용되던 MD5(Message-Digest algorithm 5, 위키피디아)가 암호화로 쓰이기는 부적합하여 해시 암호화를 위해 개발되었고 Java의 암호화 알고리즘에서는 SHA-1, SHA-256, SHA-384, SHA-512 를 지원합니다.


서론이 길었으니 일단 그 중 SHA-512 방식의 암호화 함수 예제를 한 번 보겠습니다.

 private static String getSha512(String plainText) {
		try {
			MessageDigest md = MessageDigest.getInstance("SHA-512");
			byte[] bytes = plainText.getBytes(Charset.forName("UTF-8"));
			md.update(bytes);
			return Base64.encode(md.digest());
		} catch (Exception e) {
			System.out.println("Sha512 error.");
			e.printStackTrace();
			return null;
		}
	}



  의외로 위와 같이 간단합니다.  SHA-1, SHA-256, SHA-384 등은 3번째 라인의 "SHA-512" 부분만 해당 값으로 변경하면 됩니다.  물론 간단한 코드라 Base64 인코딩이나 NullPointerException 방지를 위한 체크 등은 더 필요하구요.  


  다만 많은 구현에서 String <=> byte[] 간의 변환시에 별도의 인코딩을 지정을 안하는 경우가 많던데 그럴 경우 환경이 달라지면(예를들어 MS949 기반의 윈도우에서 구동하는 프로그램과 UTF-8 기반의 Unix에서 구동하는 프로그램이 동시에 서로 암복호화를 할 경우) 한글 등을 처리할 때 문제가 발생할 수 있으니 인코딩은 꼭 지정하시길 바랍니다.


  담번에는 대표적인 복호화 가능한 대칭키 암호화 알고리즘인 AES와 참고 사이트에서 나왔던 bCrypt에 대해서 간단히 포스팅할 예정입니다.
(일단 테스트는 다 된 상황이라.. 정리만 하면...)

'Java' 카테고리의 다른 글

"\ub4f1" 와 같은 unicode 문자열 읽어오기  (0) 2014.01.28
JDK 1.7.21에서 Runtime.exec의 변경사항  (0) 2013.04.26
:
Posted by hanavy