일반적인 암호화 알고리즘은 암호화된 데이터는 동일한 KEY로 복호화가 가능하도록 설계되어 있다.
해쉬(Hash)알고리즘은 암호화된 데이터를 복호화를 하지 못하게 하기 위하여 만들어졌다. 암복호화라는 양방향 아니라 암호화만 가능하기 때문에 단방향 암호화 알고리즘이라고 부르기도 한다.
해쉬 알고리즘은 용도는 주로 데이터의 무결성을 검증하는데 유용하게 사용되는데 데이터의 무결성이란 데이터가 정보 유통과정에서 위변조가 없었다는 것을 증명하는 것이다.
일상 생활에서 A와 B과 중요한 거래가 있을 경우 서명을 비록한 갖은 방법으로 그 계약서의 내용을 바꿀 수 없도록 하는데 해쉬의 특성은 데이터가 단 1byte가 바뀌더라고 그 값이 달리 나타나기 때문에 온라인상의 문서일 경우 이 문서가 바꾸지 않았다는 것을 증명하는데 그 문서 전체를 해쉬한 값을 A와 B가 서로 보관만 하고 있으면 계약서 사본을 별도로 카피아여 보관하지 않아도 된다.
또한 복호화할 필요가 없는 데이터의 암호화에 활용되기도 하는데 예를 들면 고객비밀번호와 같은 중요 정보는 그 고객만 알고 있으면 되고 설사 고객이 그 정보를 잊어버렸다고 하더라고 본인 확인 과정을 거쳐 다시 만들면 되기 때문에 복호화가 필요 없는 해쉬 알고리즘을 이용하여 안전하게 보관하여 활용하게 된다.
해쉬 알고리즘은 메시지 축약(Message Digest)이라고 불리기도 하는데 1바이트를 암호화하나 수백 수천 바이트를 암호화하는 항상 알고리즘이 지정한 크기로 출력된다. 일반적으로 많이 사용하는 SHA-1 알고리즘은 160비트(20바이트) 그리고 MD5는 128비트(16바이트)로 출력된다.
. 다음의 클래스를 import를 하고
import java.security.SecureRandom;
import org.bouncycastle.util.encoders.Base64;
import org.bouncycastle.util.encoders.Hex;
2. 랜덤한 20bytes를 생성하고
byte[] randomBytes = new byte[20];
SecureRandom random = new SecureRandom();
random.nextBytes(randomBytes);
3. 랜덤한 바이러리를 System출력으로 볼 수 없기 때문에 바이러리를 hexa값으로 출력해보면 40bytes로 출력된다.
String hexaed = new String(Hex.encode(randomBytes));
System.out.println(hexaed+" hexaed length="+hexaed.length());
(출력의예=> 2f8b2d2b99a687feec19ea20235f560d233aaaea hexaed length=40)
4. 랜덤한 바이러리를 Base64로 인코딩하여 출력해보면 28bytes로 출력된다.
String base64ed = new String( Base64.encode(randomBytes));
System.out.println(base64ed+" base64 length="+base64ed.length());
(출력의 예=> L4stK5mmh/7sGeogI19WDSM6quo= base64 length=28)
5. hexa나 base64로 표시된 데이터를 반대의 원본으로 바꾸려면 디코딩을 하면 된다.
byte[] base64decoded = Base64.decode(base64ed.getBytes());
byte [] hexadecoded = Hex.decode( hexaed.getBytes());
openjce에서 제공하는 함수를 이용하여 간단하게 바이러리 데이터의 hexa 및 base64 스트링 구현을 알아보았다.
스크랩 :http://blog.paran.com/blog/detail/postBoard.kth?blogDataId=27788506&pmcId=javacipher&totalCount=13&preViewPage=0&ajaxPage=1&preFBlogId=35385570&preLBlogId=27788506&pageStyle=null&myCateId=0&yearMonth=null&rDay=null&style=Board&p_eye=3월1일 우리 경으니가 태어났다.
2월 28일 부터 울 으내가 진통이 시작되었고, 난 희찬이랑 종그니랑 예정일이 일주일 정도 남아서 새벽 3시까지 술을 마셨다.
여튼 첨에 아프다고 하길래 난 생각 없이 괜히 그런가 보다 했는데, 그담날 우리 경으니가 태어났다.
솔직히, 난 으내가 얼마나 아프고 그런지는 모르겠다. 단 이것만은 안다. 이 세상에 소중한 생명이 태어났다는걸.
사실 지금도 그날 생각하면 눈물이난다. 으내가 아퍼서가 아니라 경으니가 태어나서가 아닌
마지막 으내가 한말을 잊을수가 없다.
아이고, 울 새끼 태어났어?! 힘들었지. 엄마가 미안해 울 새끼 힘들게 해서. 너무 너무 감동이었다.
출산의 고통과 출산의 행사인 탯줄 자르기 기타 등등 이런것들보다 난 저말이 너무 감동이었다.
경은아 이세상에 태어나줘서 너무 고마워~ ^^
아빠가 너무 너무 사랑해~
태어난 날 사진~