안전한 패스워드 만들기..

   조회 15553   추천 3    

흠...

이건 한 20년전부터 사용하던 방식입니다..

db에 패스워드를 저장 하는것이 올바른것인지 아닌지의 관점에서 보기에는 좀 그렇습니다..

왜냐면 패스워드 저장 방식은 개발자의 자의적인 방식이기 때문에 보편적인것만 안따르면 해킹에서도 자유로울수도 있습니다.


저는 db에 저장하는 사용자 패스워드에 관해서 적겠습니다.


db 필드


아이디 패스워드 가입일 시간분초


이렇게 4가지를 저장한다고 가정합니다.


아이디 : test

패스워드 : 아몰라 (텍스트 나 이진수나 16진수)

가입일 :20160712

시간분초 : 120000 

그럼 여기서 어떻개 저장이 되냐가 중요 합니다.


일단 사용자 입력 텍스트를 봅니다.


아이디 :test 

패스워드 : babo

그다음 저장만 눌리지요..

그러면 위에 db에 어떤식으로 저장을 하는냐는 어느정도 눈치를 을듯 합니다.

babo를 원하는 진수로 변경을 합니다.

16진수를 좋어러 하면 16진수로 바求

그다음 가입일을 곱하거나 나누거나 더하거나 기터 등등 합니다.

거기에 사건분초 까지 적용을 시킵니다.

그러면 나오는 값을 패스워드에 저장을 합니다

이때 가입일이나 가입시간분초를 같이 저장 해주시면 됩니다.

지금은 이런 알고리즘을 적어 놓았기 때문에 아쉽네 하시지만 모를경우는 그 암호가 어떻게 나왔는지 알수가 없다는 것입니다.


사용자는 자기가 알고있는 babo 만 입력하면 접속이 되지요..

아 물론 패스워드에서 패스워드 찾는 툴을 돌려 찾는 방법도 있습니다..

물론 그때는 3번 이상 틀리면 아이디 차단을 시키면 됩니다.

강좌한 방법은 db가 털려도 어떻게 알수 있는 방법이 없습니다..

가입일 시간분초 를 이용해서 다른 개인정보중 중요한 것을 연산시켜 저장 하시면 알아낼 방법이 없습니다.

함수로 로직을 만드시고 값을 대입하면 됩니다.


NeOpLe 2016-07
좋은 아이디어입니다.
그런데 꼭 사용자의 암호를 서버관리자가 알 필요가 있을까요.
그리보면 간단하게 bcrypt 시켜서 저장해 두는게 나을 것 같습니다.
만약 꼭 decryption의 필요성이 있다면 rsa 를 이용해서 자신의 public key 로 암호화 시켜서 나중에 자신의 private key 로만 복호화 시킬수 있도록 하는 것도 방법이겠죠.
이래저래 어려운 점이 암호화 같습니다.
이런 방법은 알고리듬이 털려도 key가 없이는 복호하 시킬수 없다는 장점이 있는 듯합니다.
아울러 로그인 시도 횟수에 제한둘 필요도 없어지겠죠.

대신 패스워드 저장 길이는 길어질듯 합니다.
라크리모사 2016-07
해쉬로 저장하는게 아닌이상
몇 번 시도해보면 로직을 알 수 있습니다

접속시도 차단을 한다고 해도
db가 털려서 나가버리면 방법이 없구요

패스워드 저장은 무조건 해쉬가 단연 좋습니다
     
슈퍼 컴퓨터도 100년은 걸립니다... 히히히
DB 도둑 맞아도 안전합니다...
양시열 2016-07
관리자라고해도 복호화 불가능 암호저장규정때문에 bcrypt로 암호화하고 패스워드+공통키값으로 보호하고있습니다.
정의석 2016-07
암호는 만들어서 사용하는것 보다는 기존에 나와있는 방법을 사용하는것이 안전하다고 하더라고요.
개발자가 자신만의 방식으로 암호화를 하게되면, 그 암호화 방법이 확인되는 순간 모든 사람의 암호가 다 공개될 수 있습니다.
그것보다는 공개적인 방법을 사용한것이 더 나을것 같습니다.
해시함수를 사용하게 되면 사용한 해시함수와 그 해시된 값이 공개되어도 실제 password는 노출이 안됩니다.
(단, 암호를 Decrypt 하지 않아도 된다는 전제하에서요.)
MD5가 요즘의 Computing으로는 어느정도 Decrypt가 가능하다고는 하지만, 아주 짧은 암호가 아니면 실제로는 거의 힘들다고 생각됩니다.
(암호가 짧으면 MD5 복호화 해 주는 사이트에서 어느정도 가능한 경우가 있습니다.)
요즘은 MD5보다는 SHA계열 해시함수를 사용하는것 같습니다.
그리고 여기에 황진우님이 말씀하신것 같은 추가정보(시간, 컴퓨터의 고유ID 등)를 함께 해싱하게 되면 더 안전한 암호가 될 것같습니다.
     
흠...
저위에 방식으로 저장된 암호를 슈퍼컴이 풀라고 하면 한 100년은 걸릴겁니다..
사용자별 값이 다 다릅니다... 에휴..
패턴을 알아도 찾기가 힘듭니다...
사용자가 사용하는 비밀번호도 알아야됩니다..
슬픈윈드 2016-07
꼭 그렇지많은 않아요 128암호화니 256암호화니이니 512암호화 하는게 괜시리 나온게 아니거든요.....
디비가 털리고 사이트도 털리는 순간부터는 슈퍼컴이 아닌 일반컴으로 얼마든지 알수 있습니다.(도대체 슈퍼컴으로 100년은 어디서 나온 근거인지는 몰르겠습니다.)
뭐 방정식 같은거죠 내 비번은 이런데 어떻게 저장되어 있다 다른건 뭐 이따위는 금방 풀립니다.
패턴 분석이것지요. 상위의 조건은 숫자형데이터를 곱하거나 더하는 방식은 더더욱 문제점이 발생할 수 있습니다.
황진우님의 말씀은 모든 값이 디비에 존재하기에 고로 풀기엔 얼마 걸리지 않습니다.

요새는 그냥 복호화읍는 암호화하고 저장하고 사용자 입력을 암호화해서 비교하는 방법으로 사용하고 있어요.

절대 디비안에 있는 값으로만 암호화하지 않습니다.!
세상에 ip는 얼마든지 많습니다. 그리고 얼마든지 아이디를 생성가능하구요.
     
뭐..
모든 암호가 컴퓨터가 인식할수 있는 모든 코드의 집합으로 이루어 저있으니 모든 코드로 분석을 하면야 금방 찾지요..
간단하게 생각하면 거기서 거기입니다.. 하하하
한비트의 값을 찾는 경우의 수가 모든 코드로 정해저있기 때문에 금방 찾지요...
          
슬픈윈드 2016-07
지금 128비트 암호화가 수십년이 걸린다고 합니다.
이걸 클러스터링으로 약 200대정도가 수주가 걸린다구 하구요.
암호에 대한 접근방식은 다양한 방법으로 접근합니다. 패턴이나 비트수 그외 다양한.

자세한 내용은 이 글에서 확인할 수 있습니다.
http://blog.suminb.com/post/cryptography/
윤성옥 2016-07
mssql 은 아래와 같이 암호화 함수를 제공합니다. 궂이 따로 만들 필요는 없어보이네요
https://msdn.microsoft.com/ko-kr/library/ms173744(v=sql.110).aspx
언어마다 따로 암호화 함수를 제공하는것도 있고요
보통 국정원 같은데서는 복호화할 필요가 없는 비밀번호같은건 단방향 암호화를 권장하죠
개인정보 같은건 그런걸 그냥 이용합니다. 나보다 더 똑똑한 사람들이 고민을 많이 하고
만들어낸 결과물인 함수들이 더 안전할거 같습니다.
무심 2016-09
머리가 복잡 해집니다 ^^
Neowave 2018-06
소스코드 털려도 데이터베이스가 안전한가요?
     
소스랑 db랑 다 털리면 시간이 좀걸려서 문제이지 해독이 됩니다..
          
Neowave 2018-06
해독이 가능하면 안전한 방법이 아니겠죠...?
유저 입장에선 단방향 암호화가 왜 중요한지 알아 주셨으면 하네요..
               
소스까지 털려서 암호 못푸는 방법있으면 소개좀해주세요...
                    
Neowave 2018-06
대부분의 해쉬는 브루트포싱하지 않는이상 해독이 어렵습니다

http://starplatina.tistory.com/m/entry/비밀번호-해시에-소금치기-바르게-쓰기
                         
한가지 아셔야될것이 해시값을 비밀번호 입력에서 넣는것이 아닙니다.
소스코드에는 어떤 해시를 사용 하는지도 나옵니다.
아무리 해시에 해시를 사용 한다고 해도 소스가 강탈 당하면 안풀리는 암호는 없습니다.
소스코드 까지 강탈 당하면 새로 만들어도 방법을 다시 해야됩니다.
                    
Neowave 2018-06
강력하다고 소문나서 전 세계적으로 사용하는 해쉬와 본인 이 직접만든 알고리즘을 턴다고 가정했을때 어느게 더 빨리 털릴까요? (소스코드가 다 보여졌다고 가정할때)
perillamint 2021-10
첫 댓글을 이런 글에 남기게 될 줄은 몰랐네요.

말씀하신 방법은 전형적인 [Security by obscurity](https://en.wikipedia.org/wiki/Security_through_obscurity) 의 예로, 현대 암호학에서는 굉장히 **나쁜** practice 로 여겨집니다.

대부분의 현대 암호의 프리미티브는 암호화 알고리즘이 공개되어 있으며, 보안은 알고리즘에 내재된 시간 복잡도 (요즘은 인기있는 항목으로 새로이 추가된 공간 복잡도)에 의존합니다. 대부분의 해시 알고리즘의 경우, 수학적으로 역함수를 알아내기 굉장히 어렵게 설계되어 있으며, 역함수를 알아내거나, collision 을 일으키는 generic 한 방법이 밝혀질 경우, 해당 해시 함수는 더 이상 cryptographically safe 하지 않다고 보게 됩니다. (MD5 가 더 이상 쓰이지 않는 이유)

이러한 패스워드를 '복호화' 하는 방법은 (해시 알고리즘 자체의 결함으로 인해, 빠른 속도로 해시 충돌 혹은 역함수를 알아낼 수 있는 경우를 제외하면) 해시 알고리즘의 인풋에 무차별 대입을 통해, 같은 해시가 나올 때까지 계속 시도하는 방식 (무차별 대입 공격, brute force attack)인데, 입력 패스워드가 충분히 무겁고, 좋은 패스워드 해싱 알고리즘 (e.g. Argon2, bcrypt) 를 사용하였을 때, 충분히 오랜 시간 동안 (Nvidia Titan X 기준 120kH/s, 44bit entropy password 가정 시, 4년 반 소요, https://gist.github.com/epixoip/9d9b943fd580ff6bfa80e48a0e77520d) 지연시킬 수 있게 됩니다.

이를 해결하기 위한 Argon2 의 경우, pseudo-random memory access와 병렬화 파라미터를 통해, FPGA 혹은 GPU 에게 큰 디스어드밴티지를 가하게 됩니다. (메모리 액세스 시간은 굉장히 비싸기 때문) 이 경우, Argon2i t=3 m=1536 기준 1kH/s(https://www.openwall.com/lists/john-dev/2015/08/17/62) 정도가 나오게 되고, 이는 44비트 패스워드 해독 소요 시간으로 약 558년을 필요로 하게 됩니다)

하지만, 주어진 방법의 경우, 소스 코드 누출 뿐만 아니라, 단순한 고전 암호학에 사용되었던 cryptanalysis 만으로 (네, 고전 암호는 옛저녁에 끝장난 지 오래니까요) 약간의 인간 노가다를 섞어주면 손쉽게 복호화할 수 있게 됩니다. 이는 현대 사이퍼 대비 암호학적으로 매우 나쁜 퍼포먼스를 보여주겠죠.

저도 여기에는 개략적인 것만 적었고 (제가 교양 수준의 크립토그래피 지식만을 가지고 있기도 하고) 더 알고 싶으시다면

처음 배우는 암호화 - 장 필리프 오마송 (ISBN: 9791162249451) 과 같은 암호학 입문서를 읽어보시는 걸 추천드립니다.


제목Page 19/28
2016-08   23773   키네시스
2016-08   16187   QS왕통키손…
2016-08   24579   백만스물하나
2016-08   29394   미나리나물
2016-08   26117   미나리나물
2016-08   19956   김황중
2016-07   18404   백만스물하나
2016-07   21623   백만스물하나
2016-07   26338   백만스물하나
2016-07   94830   백만스물하나
2016-07   18149   inquisitive
2016-07   28697   무아
2016-07   17347   NeOpLE
2016-07   14520   이지포토
2016-07   13587   isaiah
2016-07   13303   황진우
2016-07   15554   황진우
2016-07   30005   두포리
2016-06   25106   백두성
2016-06   17712   무아