[완료] C에서 MD5로 문자열을 암호화
글쓴이: goderro / 작성시간: 목, 2011/10/20 - 7:33오후
안녕하세요
http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/%C6%C4%C0%CF%BA%AF%C1%B6%B0%CB%BB%E7
를 참조하여 파일이 아닌 문자열을 MD5로 만들고 있습니다.
허나 문제가 생겨버렸네요..
테스트 하면
1822b3adc75e01eac3197efbfdd419ee
5f0f4d52a2ad304cf7434ef3031d5a2e
db1b5f71fb8acffe1904a720ada6ea0e
3번 테스트한 결과입니다. 각각 다른결과가 나오더라구요 같은 문자열을 인풋했는데 이렇습니다..
파일에 md5로 암호화된 문자열을 입력된 문자열을 암호화하여 비교하려 하는데
암호화하는 결과가 다르다니...
위 링크와는 조금 변형을 하였습니다. 링크는 파일 정보를 읽어서 체크썸 하는거고 저는 입력된 문자열을 암호화하는 것입니다.
조언 부탁드립니다..
while(!feof(stream)) { if(fgets(buffer, 80, stream)==NULL) break; p = strtok(buffer, ":"); printf("%s\n",p); if(!strcmp(id, p)) { p = strtok(NULL, ":"); printf("olleh\n"); sprintf(temp, "%s:%s",id,password); printf("%s\n",temp); MD5_Init(&lctx); MD5_Update(&lctx, temp, sizeof(temp) ); MD5_Final(digest, &lctx); for(i=0; i < sizeof(digest); ++i) { sprintf(md5msg+(i*2), "%02x", digest[i]); } printf ("%s\n", md5msg); if(!strcmp(p, md5msg)) printf("correct!\n"); else printf("invalid\n"); } }
Forums:
해결했네요
MD5_Update(&lctx, temp, sizeof(temp) );
이부분을 MD5_Update(&lctx, temp, strlen(temp) );
으로 바꿔주니 여러번 돌려도 똑같은 결과가 나오네요...
초보자의 실수라 부끄러울 따름입니다.
저같은 실수 하시지 말라고 남겨놓습니다.
그런데 사족을 걸자면 MD5로는 암호화를 하는게
그런데 사족을 걸자면 MD5로는 암호화를 하는게 아닙니다.
엇, 제가 말하려고 했는데;;
..선수를 치셨군요 ;ㅂ;
이 계정은 더이상 사용하지 않고 있습니다.
솔직히 말하면, 흑역사뿐인 계정이니, 이 서명이 붙은 글은 못 본 척 해주시면 좋겠습니다ㅠㅜ..
음.. 그럼?
MD5가 파일 checksum 용도로 많이 사용하는걸 말씀하시는 건가요?
MD5는 그냥 hash function입니다. 단지,
MD5는 그냥 hash function입니다. 단지, 수학적으로 역함수가 없으므로, 단순암호화에 사용되곤 했지요.
하지만, MD5가 암호화로 적합해서가 아닙니다.
보안이 중요한곳에 MD5를 암호화 알고리즘으로 사용하는것은 삼가해어야합니다.
http://codahale.com/how-to-safely-store-a-password/
윗글에서 말하듯이
MD5 생성 알고리즘은 너무 단순하여,
GPU를 가속을 이용하면, 1분안에 엄청난수의 MD5를 대입/비교 해 볼수 있습니다.
MD5로 암호화 하셨다면, MD5로 *암호화*된 패스워드 파일이 유출됐을 경우,
짧은 시간안에 그냥 뚫려버리죠. 요즘 같이 슈퍼파워 GPU시대에는
몇일안에 모든 가능한 MD5 경우의 수를 생성하여 비교하는것이 가능할런지도 모릅니다. ( 물론, 아주 잘 짜여지고 최적화된 memory operation같은것도 가정되어야 하겠지만.. )
하지만,
윗글에서 예를 든, bcrypt만하더라도, MD5 hashing 보다 암호화 생성 과정이 더 복잡하여
*상대적으로* 짧은 시간안에 MD5만큼 빠르게 암호화된 데이터를 생성할수 없습니다.
MD5는 hash function입니다.
좋은 hash function의 요건 중 하나는
생성속도가 빨라야 합니다. 체크섬 만드는데 소비되는 시간이 너무 크면 곤란하지 않겠습니까.
즉, MD5의 태생 자체가, 무작위로 모든 경우의 수를 마구잡이로 암호화 해서
암호화된 결과를 비교해버리는...그런식의 brute force 크랙킹에 근본적으로 취약한넘입니다.
다시 말하지만, MD5는 hash function입니다. 암호화를 위에 만든 알고리즘이 아닙니다.
---------
또 한가지, MD5는 full-hashing function이 아니라는것이 이미 밝혀졌습니다.
즉, 비밀번호가 달라도( 원본 데이터가 달라도 ),
MD5로 생성된 결과물은 같을수도 있다는것이 밝혀졌습니다.
수학적으로 말하자면, 완벽한 1-to-1 function이 아닌거죠.
위키페이지 가보시면 잘 설명되어있습니다.
덧붙이자면..
덧붙이자면 브루트 포스 말고도 상당수의 상당수의 경우를 커버하는 딕셔너리까지 나와 있습니다. 물론 이건 SHA도 마찬가지지만요.
서버를 돌리는 용도라면 서버측 소스에다가 키값을 섞거나 해서 조금이나마 공격을 지연시킬 수 있습니다만.. 그래도 MD5는 다른 알고리즘에 비해 신뢰도가 떨어집죠. 게다가 서버쪽 코드가 털리면 끝.
댓글 달기