암호화폐에 관한 지대넓얕 (1) - 해시 알고리즘
개발자로서 암호화폐만큼 평가하기 힘든 기술이 있을까 싶습니다.
POW, 일명 채굴이 지금 트렌드인 딥러닝과 관련되어 틈틈이 공부하다가 2018년 1월에야 코린이로 입문하여 처절한 손실을 맛보고 있는 중입니다.
2010년에 비트코인을 접하고도 신박한 정도로만 생각했지 이 기술에 대한 적절한 가치와 가격을 몰라보고 주욱 관망만 하다가 수익 인증은 고사하고 결국 흑두루미가 되고 말았군요.
자의가 아닌 강제적으로 Buy and Hold, 일명 John-Buh 전략을 지향하게 된 코린이로써 steemit의 수준 높은 글들을 읽으며 빤스런의 욕구를 참고 있습니다.
저 또한 여러 고수님들께 많은 가르침을 받은 입장에서 이런 폭락장에서 혹여라도 이 글을 읽으며 조금이라도 재미있으신 분이 있다면 보람을 느낄 수 있겠지요.
오늘은 보안 이론 중에서 증명의 가장 기본단위인 해시(hash) 알고리즘에 대해 넓고 얕게 써보도록 하겠습니다.
http://www.whatsmyip.org/hash-generator/ 사이트로 가서 Input String 란에 "나는 흑두루미입니다." 를 입력하고 Calculate Hashes 버튼을 클릭해보세요.
빨간색 박스에 나열된 것들은 해시 알고리즘 종류이고 녹색 박스는 Input String 란에 입력한 문자열을 해시 함수로 돌려서 출력한 값입니다.
비트코인에서 사용되는 해시 알고리즘인 sha256 하나만 살펴보죠.
“나는 흑두루미입니다.” -> sha256 -> b95f6ac40aeeaf8e8a78df839d18f29e70b11ba9f5ee5966a007fa3215e3c684
왠지 좀 유식해 보이도록 표현해보겠습니다. ㅎㅎ
sha256(“나는 흑두루미입니다.”) = b95f6ac40aeeaf8e8a78df839d18f29e70b11ba9f5ee5966a007fa3215e3c684
이번엔 "나는 흑두루미입니다."를 “나는 백두루미입니다.”라고 살짝 바꿔서 입력하고 Calculate Hashes 버튼을 클릭해보겠습니다.
하단의 Hashes 항목들이 모두 바뀌는 것을 보실 수 있을겁니다.
sha256(“나는 흑두루미입니다.”) = b95f6ac40aeeaf8e8a78df839d18f29e70b11ba9f5ee5966a007fa3215e3c684
sha256(“나는 백두루미입니다.”) = f6e1b73aefa59bf190b1be5b6b8d9f853480a2c4d2530412253a0372191aa812
흑과 백, 한 글자 차이인데도 해시 값이 많이 달라졌습니다.
해시 함수는 입력 값이 약간만 바뀌어도 출력 값이 바뀌는 특징을 가지고 있습니다.
또한 이론적으로 입력값으로 문자열을 입력하던, 커다란 바이너리 값을 입력하던 입력 값의 길이 제한이 없으나 출력 값의 길이는 항상 일정합니다.
이런 특징이 얼마나 유용하냐 하면
A가 2기가 바이트짜리 문서를 작성하고 이 파일을 해시한 값을 보관합니다.
A는 B에게 인터넷으로 문서 파일을 전송합니다.
인터넷으로 전송되는 중간에 해커는 A가 작성한 이 파일을 가로채서 데이터를 살짝 1바이트만 바꿔버린 후 B에게 보내줍니다. 아마도 이 해커는 2기가나 되는 문서에서 1바이트 정도만 살짝 바꿔도 누구도 알아채지 못할 것이라고 생각할겁니다.
A는 B와 따로 만나서 문서의 해시 값만 알려줍니다. sha256으로 해시한다면 32바이트(16진수 처리하면 64자)이므로 포스트잇에 써서 따로 전달해줄 수 있습니다.
B는 인터넷으로 전송받은 문서파일이 안전한지 검사하기 위해 문서 파일을 해시한 값과 A에게 따로 받은 포스트잇에 적힌 해시 값을 비교해봅니다. 해커가 중간에서 문서 파일의 1바이트만 살짝 바꾸었기 때문에 당연히 A가 작성한 원본 문서의 해시 값과 B가 인터넷으로 전송받은 문서의 해시 값은 다를 것이며, B는 누군가 이 문서의 값을 변조한 것을 알아차릴 수 있을 겁니다.
위의 항목들에 개인키/공개키를 적용하면 전자서명을 통한 무결성을 증명하는 확인 절차를 구현할 수 있습니다만 일단 다음으로 미루고 해시 알고리즘의 특징인 "무결성의 증명" 을 설명하는 예문으로 이해해주시기 바랍니다.
대용량 파일을 전송받을 때에도 마찬가지입니다.
몇 백 메가바이트가 넘는 유틸리티 파일을 다운받을 때 보면 저런식으로 해시 값(빨간색 박스)을 표시해주는 사이트들이 간혹 있습니다.
인터넷으로 파일을 다운로드하다 보면 전송 오류로 파일의 손상이 되었거나 실행 파일의 경우 중간에 해커가 가로채서 백도어나 랜섬웨어를 심었을 수도 있습니다.
그럼 뭘 믿고 제대로 다운로드했는지 알 수 있을까요?
다운로드를 완료한 다음에 해시 유틸리티로 돌려서 사이트에서 표시하는 해시 값과 비교해보고 해시 값이 서로 동일하다면 사이트에 올려놓은 원본과 같으니 안심하고 사용하라는 의미입니다.
shaX, x=1, 256, 384, 512...
보통 해시 함수는 알고리즘 이름 뒤에 숫자가 붙는 식인데 이 숫자가 길수록 내부 상태와 블럭 크기가 증가해서 해시 값이 길어지게 됩니다.
이렇게 길면 길수록 입력 값이 바뀌어도 출력되는 해시 값이 겹칠 가능성이 줄어들게 됩니다.
위 표의 가장 마지막 컬럼인 충돌 항목에서 해시 값이 상대적으로 짧은 SHA-0과 SHA-1은 입력 값이 다름에도 불구하고 출력되는 해시 값이 같게 출력되는 충돌의 경우가 보고되었지만 아직 sha256 이상의 해시 알고리즘에서는 충돌을 발견하지 못했습니다.
따라서 이러한 해시 알고리즘을 열심히 테스트하시다가 충돌의 경우를 발견하시면 보안 관련 학술지에 이름을 남기실 수 있습니다.
명예를 위한 채굴이라 생각하시고 한번 도전해보시는 것도... 그렇지만 발견 못해도, 인생의 좋은 경험이라고 생각하고 열심히 해야지 방법이 없습니다.
해시 함수는 출력되는 값을 통해서 입력 값을 알아낼 수 없는 단방향 함수입니다.
입력 값 -> 해시 함수 -> 출력 값 (O)
출력 값 -> 해시 함수를 역연산 -> 입력 값 (X)
해시 함수는 압축 함수도 암/복호화 함수도 아닙니다. 오직 가변적인 입력 값을 받아서 정해진 길이의 값으로만 출력할 수 있습니다.
상식적으로 생각해서 2기가 짜리 문서 파일을 해시해서 나온 값은 길어봤자 64바이트(16진수로 128자)인데, 이 값으로는 2기가 짜리 문서 파일을 복원할 수 있을까요? 할 수 있다면 기적의 압축 알고리즘이겠죠.
예를 들어 웹사이트를 개발할 때 서비스 가입자의 로그인 암호는 해시 함수를 돌린 후 데이터베이스에 저장하도록 권장(이라 쓰고 강제라고 읽음)하게 되어있습니다.
왜 이렇게 할 까요? 암호를 암호화시켜서 저장할 수도 있을텐데 말이죠.
암호를 암호화하면 암호화할 때 사용했던 키로 복호화도 할 수 있습니다. 만약 해커가 이 암호를 암호화할 때 사용했던 키를 털면 데이터베이스에 저장된 사용자의 암호들도 다 복호화할 수 있게 되어 해당 사용자 계정들은 다 털려버립니다.
사용자의 암호는 원래의 값을 절대로 알 수 없도록 저장되어야 합니다! 그럼 출력 값으로 입력 값을 추측할 수 없는 함수는? 해시 함수!
사용자가 가입할 때 해시 함수를 사용해서 암호를 해시하여 데이터베이스에 저장하고, 로그인할 때 암호를 입력하면 이를 해시하고 데이터베이스에 저장된 해시 값과 비교하여 같으면 로그인을 허용합니다. 오오~~~ 그럴 듯 하지 않습니까?
초창기 웹서비스들을 보면 사용자 암호를 잊어버렸을 때 인증 절차를 거치고 나면 이메일이나 SMS로 이전에 설정했던 암호를 알려주는 방식이었습니다.
그런데 말입니다.
이런식으로 사용자의 암호를 알려줄 수 있다면 적어도 사용자의 암호를 해시해서 데이터베이스에 저장하지 않았다는 증거로 볼 수 있으며 해킹으로 데이터베이스가 털리면 해당 사용자들의 계정은 자동문이 되겠죠.
암호를 암호화한다고 해도 암호화할 때 사용했던 사용자 별로 암호화 키가 다른게 아니라 모두 같은 키로 암호화했다면 털리는 것은 시간문제라고 봐야죠.
요즘 웹서비스들은 사용자 암호를 잊어버렸을 때 인증 절차를 거치고 나면 이메일이나 SMS로 사용자의 암호를 재설정하거나 임시 암호를 발급해서 알려주는 방식입니다.
데이터베이스에 사용자의 암호를 해시해서 보관하고 있으므로 단방향 함수인 해시 함수의 특징 상 원래의 암호를 복원하는 것이 불가능하기 때문에 아예 재설정해버리는 겁니다.
다음번에는 이러한 해시 함수의 특징을 활용하여 어떤식으로 비트코인에 사용되는 nonce 값과 결합해서 블럭을 생성하는지(라고 읽고 채굴이라고 씀) 살펴보려 합니다. 많은 응원 부탁드립니다.
시간이 널널하면 아래와 같은 글들을 써보려고 합니다.
- 암호화폐에 관한 지대넓얕 - 비트코인, POW의 해답인 nonce?
- 암호화폐에 관한 지대넓얕 - 왜 POW, 채굴에는 GPU를 사용하는가?
- 암호화폐에 관한 지대넓얕 - 대칭키/공개키/개인키 그리고 공인인증서
- 암호화폐에 관한 지대넓얕 - 병렬 컴퓨팅의 관점에서 채굴이랑 딥러닝은 먼 친척 관계?
시간이 널널한데, 이더리움과 리플 둘 다 떡상하면 !!!
- 암호화폐에 관한 지대넓깊(?) - 채굴 프로그램 개발에 도전해보자.
- 암호화폐에 관한 지대넓깊(?) - POW를 적용한 짭 트론을 만들어보자.
감사합니다.
와우..어제 처음 비트코인/이더리움 백서를 본 후에 이 글을 보니까 해시 알고리즘이 이해가 잘되네요..감사합니다!!
스팀잇에 처음 포스트해보는 코린이입니다. 도움이 되셨다니 큰 보람을 느낍니다.
환영합니다~팔로우 하겠습니다 ^^ 스팀잇 가입과 알아 두셔야 할점들 간단하게^^
일단 1.팔로우먼저50-100명한다2.그리고 글을쓴다(이전에 글 써봐야 잘 노출이 안된다)3.보팅은하루에10~15 회정도만보팅 80%유지 4.다른사람 보팅 할때는 30분이상 지난 글에 보팅을 한다( 바로하면 보팅수익없음)5.제목 오른쪽에 온천 표시 안 나오도록, 1스팀이 1USD 이상일 때 보상은 50:50으로 설정6.댓글소통을 많이하라 스팀잇을누벼라~!! 7. 천천히 시간을 가지면서 여유롭게 해라 모든 급하게 서두르면 급체하는법
스팀잇에 처음 포스트해보는 코린이입니다. 환영해주셔서 감사합니다.
네네 환영합니다 ~!! 즐거운스팀잇 되세요 ^^
보상이 너무 적은 것 같아요. 더 많은 분들이 보실 수 있기를..ㅋㅋ 앞으로 나올 글들도 기대되네요. 팔로우할게요~~~~
큰 격려에 감사드립니다.
개발자가 쓰다보니 지대넓얕에 어울리지 않게 너무 지루하게 쓴 것이 아닌가 걱정입니다.
좋은글 감사합니다. " 암호화폐를 위한 지대넓얕 - 왜 POW, 채굴에는 GPU를 사용하는가?" 이편이 정말 기대됩니다. 많이 궁금했었거든요!ㅎㅎ
완전 도움이 되었어요
블록체인당에서 글 잘봤습니다
공대출신임에도 이해가 안되어 애를먹었는데 쉽게
한번더 풀어주시니 이해가 너무 잘 됩니다. 팔로우 하고 가요 :) 양질의 글 감사드립니다.