MD5는 왜 안전합니까?

armyinsa의 이미지


암호를 MD5로 하려고 하는데요.

문뜩 MD5를 사용하면 왜 안전한지요? 알고싶네요..

다콘의 이미지

요즘은 md5가 안전하다고 하기는 힘들겠네요.
http://www.golubev.com/hashgpu.htm

danskesb의 이미지

암호로 무언가를 사용하시려면 HMAC을 사용하십시오. 많은 웹 프레임워크에서 도입하고 있습니다. 있는 그대로 MD5를 사용하는 것보다 더 안전합니다.

http://en.wikipedia.org/wiki/HMAC

---- 절취선 ----
http://blog.peremen.name

웃는 남자의 이미지


많이 쓰이는 예를 들면
우리가 사이트에 가입할 때 입력하는 주민번호를 해슁하여 저장하게 되면
사고로 DB가 유출되더라도 회원들의 주민번호를 알아내기가 힘듭니다.

md5는 단방향으로만 암호화(not encrytion, is hashing)가 되므로 같은 주민번호를 다시 입력했을 때 나오는 해쉬값이 동일한 지 비교함으로서 주민번호의 일치여부만 확인할 수 있습니다.
이러한 점은 회원의 주민번호(개인정보)의 유출을 방지하면서도
DB상에서 각 회원의 개별성을 유지할 수 있는 해슁알고리즘의 장점입니다.

세상 어떤 것이든 완전히 안전한 것은 없듯이 해쉬함수도
고성능의 brute force , rainbow table 을 이용한 방법에는 취약합니다.

----------------------------------------
Nothing left after Nirvana.

----------------------------------------
Nothing left after Nirvana.

bushi의 이미지

뒤집어 생각할 필요도 있습니다.
유출되어도 노출이 되지 않기 위해선, 서로 다른 입력에 대해 같은 결과가 많이 나오는 hash 가 유리하겠죠.
brute force 를 한다해도 원본을 알아내기 위해선 찍기 실력이 더 필요할테니까요.

따라서, 노출되면 안되는 주민등록번호에 대해 개별성이 확보되는 hash를 사용해서 저장한다는 것 자체가 넌센스입니다.
유출되면 바로 노출되니까요.

OTL

웃는 남자의 이미지

다른 주민번호를 입력해도 같은 해쉬값이 나오게 된다면 회원을 어떻게 구분하겠다는 건가요?

'서로 다른 입력에 대해 같은 결과가 많이 나오는 hash'와 같은 해쉬알고리즘은 존재하지 않습니다.

해슁알고리즘은 '단방향'입니다.
해쉬값을 얻는다하더라도 원래의 입력값(주민번호)를 알아내기는 힘듭니다.

서로 다른 입력값에 동일한 해쉬값이 나오는 해쉬충돌이 일어난 가능성은 극히 드뭅니다.

----------------------------------------
Nothing left after Nirvana.

----------------------------------------
Nothing left after Nirvana.

bushi의 이미지

brute force 를 언급하셨던 이유가 뭔가요 ?

10^13 개의 입력에 대해 10^13 개의 서로 다른 hash 가 나오는게 보장된다면,
10^13 개의 입력을 만들어서 10^13 개의 결과를 뽑아낸다음,
그 사이트에서 가져온 개인정보와 비교하기만하면 모든 회원의 주민번호를 숫자하나 틀리지 않고 꺼낼 수 있습니다.

제 첫 댓글의 내용은 주민번호로 회원을 구분하지 말라는 것이지,
'서로 다른 입력에 대해 같은 결과가 많이 나오는 hash' 를 사용해서 회원을 구분하라는 뜻이 아닙니다.

OTL

planetarium의 이미지

해당 사이트에서 해시값을 만들때 주민번호 자체만이 아닌 임의의 정보(사이트 주소의 일부라거나, 회원의 아이디라거나, 뭐 기타 등등 아무것이든)를 포함시켜서 생성하면 됩니다. 무엇을 포함하는지는 공개하지 않고요.

웃는 남자의 이미지

해쉬함수가 사용되는 예로 한가지로써 주민번호를 든 것 뿐인데
'주민번호로 회원을 구분하지 말라' 는 요지의 코멘트는 해슁알고리즘이 왜 안전한 지 묻는
쓰레드의 주제와는 별로 상관없는 얘기네요.

10^13개 미만의 조합이 되는 주민번호의 경우 해시값만 저장한다면
역해시값을 이용한 brute force 에 금방 풀려버리게 될꺼라는 정도는 쉽게 알 수 있습니다.
그래서 단순하게 13자리수의 주민번호만으로 해슁하지 않습니다.
각 회원의 비번찾기용 답이라든지 전화번호등을 같이 사용해서 입력값을 충분히 늘려주고 사용합니다.
그외 해슁할 때 salt(random 으로 생성되는 키)를 사용하여 한번 더 암호화를 해줄수도 있습니다.

암호키의 강도가 약하면 복호화 가능성이 커지는 것처럼
해쉬함수도 겨우 13자리 숫자와 같은 짧은 입력값에는 단방향성 함수라고 해도
역해쉬값 비교가 수월해지는 것은 마찬가지입니다.

그리고 주민번호처럼 unique한 값에 해슁을 적용하는 것은 타당한 방법입니다.
낮은 hash collosion 으로 1:1 매칭으로 쓸만하기에 원 값을 숨기면서 개별성을 유지하기에 좋은 수단입니다.
단지 길이가 짧아서 문제라면 보완하는 방법으로 쓰면 되는거구요.

----------------------------------------
Nothing left after Nirvana.

----------------------------------------
Nothing left after Nirvana.

winner의 이미지

평문공간(입력될 수 있는 평문암호가지수: 함수로 이야기하자면 정의역)이 충분히 크고,
인코딩문장공간(MD5는 128bit이므로 2^128가지수겠죠. 함수로 이야기하자면 치역) 역시 충분히 크다면
MD5 인코딩된 문장을 가지고 원래 평문을 알아낼 수가 없습니다.

MD5와 같은 Message Authentication Code(MAC) 함수들은 단방향함수이고
역방향으로 추측할 수 있는데 도움이 될만한 방법이 없습니다.
수학적으로 이야기하자면 정의역에서 치역으로 전환될때 균일분포 무작위라고 할 수 있죠.

M.W.Park의 이미지

딴거 쓰라는 권고가 있습니다.

http://cwe.mitre.org/data/definitions/327.html

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

소타의 이미지

암호화 하는 함수를 사용하시고 salt는 숨겨주거나 룰로 만드는 쎈쓰!

Ayine의 이미지

냉무

lacovnk의 이미지

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.