주민등록번호를 암호화해서 저장하면 안전할까요?

시지프스의 이미지

2010년 1월 29일부터는 주민등록번호를 반드시 암호화하여 보호하도록 해야 한다고 들었습니다.
(개인정보의 기술적∙관리적 보호조치 기준, 방송통신위원회 고시 제2009-21호(2009.8.7))
이게 실제로 얼마나 지켜질지는 저도 모르겠지만요.

그런데 주민등록번호를 암호화해서 저장하면 정말 안전한가요?
생년월일이나 성별은 다른 경로로 알 수 있고 마지막 자리는 체크섬이므로,
5자리만 찍어서 대입해보면 주민등록번호를 알 수 있거든요.
경우의 수가 겨우 10만 개밖에 되지 않으니 이정도는 일도 아니겠네요.

주민등록번호에 더미를 붙여서 암호화하면 조금 더 안전하겠지만,
예를 들면, kldp@#$@!5215125(주민등록번호)34^$@#@#$^#@$를 암호화하는 거죠,
더미가 같이 유출되면 똑같은 상황이죠.

제로보드 5가 나왔지만, 아직 소규묘 웹 사이트의 대부분은 제로보드4를 사용하고 있는데요.
제로보드 4에서는 주민등록번호를 입력받는 것이 거의 기본으로 되어 있습니다.
암호화하므로 안전하다고 주장하지만 이게 얼마나 안전할지 궁금하네요.
소스까지 공개되어 있기때문에 암호화 알고리즘도 드러나 있고,
운영자가 소스까지 고쳐가면서 사용할 것 같지는 않거든요.
(그정도로 개인정보 보호에 신경을 쓴다면 주민등록번호를 아예 요구하지 않겠죠.)

1월 29일 이후로 그 많은 웹 사이트들은 법(?)/기준(?) 개정의 영향을 얼마나 받을까요?
이에 대해 고지하는 웹 사이트는 전혀 본 적이 없어서 말이죠.
특히 소규묘 웹사이트는 전혀 신경도 안 쓰는 것 같네요.

추가:
물론 근본적인 해결 방법은 주민 등록번호를 아예 안 받는 것이지만, 현실적으로 불가능해 보입니다. 대형 사이트는 운영자가 한두 명도 아닐 것이고, 주민등록번호 보호 문제를 모르는 것도 아닐 것인데, 계속 안 고치는 것을 보면 그냥 고칠 생각이 없거나 법적인 이유로 고칠 수 없는 것 같습니다.

제로보드 4 회원가입 창에서 주민등록번호를 암호화하므로 관리자도 알 수 없다고 나오니, 일부 소규묘 웹사이트 운영자는 운영자 스스로도 주민등록번호가 안전하게 보호된다고 굳게 믿고 있을지도 모르겠네요. 저도 정말 안전한지 궁금해서 글 제목에 "?"를 붙였던 것이고요. 결론은 별로 안전하지 않다는 것 같네요.

planetarium의 이미지

사실 고향이 어딘지만 알면 10번 시도 안에 매우 높은 확률로 주민등록번호를 알아낼 수 있죠.

그런데 "5자리만 찍어서 대입해본다" 고 치면,
주민등록번호를 저장하지 않으면 정말 안전할까요?

시지프스의 이미지

주민등록번호를 저장하지 않으면, DB가 유출되더라도,
찍은 주민등록번호가 정말 맞는 번호인지 검증할 방법이 없으니까요.
하지만 암호화된 결과를 알고 있으면, 검증이 가능하죠.

begin{signature}
THIS IS SPARTA!!!!!n.
end{signature}

dl3zp3의 이미지

거의 모든 대형 사이트가 주민번호를 요구하는 것 자체도 문제지요.
스팸문제를 추천/비추 시스템, 스팸감지자동화, 선택적 captcha 테스트 등으로 제대로 해결하기가 귀찮다고 그냥 1인1계정을 강요하는 것도 문제.

chungsy02의 이미지

어차피 대형 사이트들은 인터넷 실명제 때문에 주민등록번호를 확인해야 합니다.
하지만 어떤 사이트에서는 주민번호가 그들의 서버에 저장되는 것은 아니라고 밝혀놨더군요.
말하자면, 주민등록번호를 저장해 두지 않더라도 주민번호 확인 서버로부터
그 사람을 identify 할 수 있는 '무언가'를 받아서 저장해 두고
나중에 그 유저가 사고를 치면(?) 사이버 수사대는 그 '무언가'로부터 주민번호를 확인할 수 있을거라는 뜻이지요.

그런 식이라면 사실 옥션같은 현금 거래 사이트라 하더라도 주민 번호를 저장할 필요가 없습니다.
주민 번호가 필요한 문제라면 경찰서를 가야 할 때인데
경찰서에 갈 때 주민번호 서버로부터 받은 '무언가'를 가져 가면 그만이지요.

개인적으로 흥신소를 찾아가야 한다면 필요하긴 하겠군요.. -.-;;;

guybrush1의 이미지

정말 필요하면 주민번호 뒷 3~4자리 정도만 받아도 본인 확인은 높은 확률로 할 수 있을 것 같은데...

dl3zp3의 이미지

사실 대형사이트는 법적으로 주민번호를 받도록 하는 법이 있는 것 같아서 어쩔 수 없긴 합니다만, 재벌과 정치인의 악행을 까발리는 악플러(?)를 수색 및 처단하려면 그런 게 필요하긴 하지요, 근데 대형사이트가 아닌 경우는 그냥 사이트가입이나 로그인 관련 시스템를 만드는 거 자체를 스킵하고 OpenID계정만 받는 것도 좋은 방법입니다.

맨발의 이미지

MD5 Decrypt 할 기세...

--------------------------------------------
:: 누구보다 빠르게 남들과는 다르게

lifthrasiir의 이미지

key space가 작기 때문에(~50억개1) 정확한 알고리즘만 알면 어렵지도 않습니다.


  1. 원래는 10^13입니다만 마지막 체크 자리는 앞자리에 따라 유일하게 결정되고 날짜 부분도 큰 제한이 있죠. 성별 부분도 모든 숫자를 쓰는 게 아니고... ↩︎

academic의 이미지

말씀하신 것에 동감합니다. 토다는 건 아니고... 그냥 참고 삼아...

주민등록번호에 외국인 등록번호도 포함한다면(같은 13자리 체계이므로) 성별 부분에 모든 숫자가 들어갑니다.

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

guybrush1의 이미지

참고로 md5 hash는 깨진지 좀 됬습니다.
md5 는 hash function이기 때문에 decrypt 라고 하는 부르는 것은 맞는 말은 아니겠지만 어쨋건, 어떤 string으로 md5 sum을 계산했을 때, 해당 string을 모를 채 md5 sum만 보고 같은 md5 sum을 가지는 (같거나 다른) string을 계산하는 것이 실용적으로 가능합니다.

따라서 모든 주민번호를 다 시도하면서 같은 md5 sum이 나올 때까지 계산하는 방법은 쓸 필요가 없습니다. (그리고 여러 주민번호가 한 md5 sum으로 mapping될 수 있기 때문에 그렇게 해도 정확히 처음에 입력한 주민번호가 뭔지 알 수 없습니다)

lifthrasiir의 이미지

깨졌다는 말이 무엇인지 정확히 이해를 못 하신 것 같습니다.

md5 해시의 현재 알려진 취약점은 어떤 평문 p이 있을 때 적은 시간(현재는 몇 분 정도로 가능합니다) 안에 p와 비슷하지만 살짝 다른 평문 p'가 같은 해시를 가질 수 있도록 할 수 있다는 것입니다. 물론 이 정도의 공격 만으로도 암호학적인 사용 여지는 굉장히 줄어 듭니다만, 임의의 역변환(이를테면 특정한 해시 값을 가지는 일정 길이의 평문을 찾는 것)은 여전히 어렵습니다. 앞으로 안 나타나리라는 보장은 없지만요.

따라서 해시의 "역변환"은 여전히 모든 가능성을 뒤지는 brute force 밖에 방법이 없습니다. 그리고 이 brute force는 당연히 가능한 평문의 갯수에 따라 그 속도가 결정되는데, 가능한 주민등록번호의 숫자가 제한이 있으니 굉장히 현실적인 공격이 가능해지는 것입니다. 매 번 같은 md5 값을 찾을 필요도 없고, 레인보우 테이블 같은 자료 구조로 미리 계산해 둔 뒤 빠른 검색을 시도하는 방법이 흔히 쓰입니다. 이건 md5가 아닌 다른 해시라도 마찬가지입니다.

이런 이유로 저는 주민등록번호를 애초에 받아서는 안 된다고 주장하는 것입니다. 주민등록번호는 개인이 선택도 할 수 없으며 그 길이도 조정할 수 없기 때문에 유출되기 쉬운데, 그럼에도 개인을 식별하는 매우 중요한 방법으로 (여전히) 사용되고 있는 것 자체가 바람직한 일이 아니죠.

(아, 그리고 md5 해시가 아무리 깨졌다고 하더라도 여러 주민등록번호가 같은 해시값을 가질 가능성은 굉장히 작습니다. 해시 함수가 근본적인 문제가 있어서 이를테면 평문 어떤 비트랑 해시 어떤 비트랑 굉장한 상관관계가 있다 이 수준이면 모르겠습니다만, md5는 그게 아니죠. 대강 계산해 보면 4×10^-20 정도의 확률이 나옵니다. 버스데이 공격 참조.)

(마크다운 포매터가 완전하지 않은 모양인지 좀 깨지는데 보는 데는 불편함이 없으므로 그냥 냅둡니다.)

guybrush1의 이미지

아, 제가 완전히 잘못 알고 있었군요.
collision attack의 경우는 message signing의 경우에 주로 문제가 되는 것이겠군요.

여러 주민등록번호가 같은 해시값을 가질 가능성이 낮다는 것에는 동의하지만, Birthday attack에 나온 내용은 실제로 같은 해시값을 가지는 다른 메시지를 '찾는' 확률이기 때문에, 그렇게 계산한 확률이랑은 (겹치는 해시값이 있느냐 없느냐의 확률과) 다를 것 같은데요.
여러 주민번호가 같은 해시값을 가지는 경우가 있는지 없는지는 그냥 message space랑 tag(이 경우는 md5) space의 크기를 비교해 보면 (minimum)확률값이 나올텐데, 계산해 보면,

message space - 주민번호가 13자리이고, 이를 string으로 처리해서 md5 hash를 계산했다고 가정하면 (대강) 8*13 = 104 bit
tag space - md5 니까 128bit

그래서 확률은 (minimum) 2^-24 = 6*10^-8 정도로 나오네요. 이게 minimum 값이고 실제 확률은 (해시 함수의 품질에 따라서) 아무래도 저거 보다는 좀 높을테니, 우리나라에서 1,2명은 (여전히 확률은 낮겠지만) 같은 해시값이 나올 수도 있겠네요. (10^-20 의 경우는 거의 나올 확률이 없다는 건데, 좀 다르지요.)

dl3zp3의 이미지

경제에 대해서는 "작은 정부"를 좋아하는 정치인이 인터넷문제에 관해서만은 대형사이트 맘데로 하도록 놔두지 않고 정부가 이것저것 간섭하는 "큰 정부"를 추구하는 게 재미있는 현상이죠.

babel의 이미지

현재 주민등록번호 알고리즘 체계로는 근본적인 대안이 될 수 없습니다
생각보다 단순하기 때문에 조금만 관심이 있으면 주민등록 몇자리 만으로도 전체 주민번호 알아내는것은 식은죽 먹기죠

불편한웹의 이미지

/etc/shadow 파일을 패스워드 크래커 프로그램으로 돌려본 분들은 암호화가 되어 있더라도 패스워드 알아내는 것이 어렵지 않다는 것을 알고 계실 겁니다.

그렇다면, 현행 공인인증서는 어떨까요.
http://abnormalweb.blogspot.com/2010/01/blog-post_9858.html
일단, dictionary, brute-force 는 가능할 것 같은데요.