안전한 비밀번호 기록을 구현하는 방법


23

보안상의 이유로 비밀번호를 일반 텍스트로 저장해서는 안됩니다. 해시를 저장해야하며 레인보우 테이블 공격을 피하기 위해 해시를 신중하게 생성해야합니다.

그러나 일반적으로 마지막 n 개의 비밀번호 를 저장하고 다른 비밀번호간에 최소한의 복잡성과 최소한의 변경을 적용해야합니다 (Password_1, Password_2, ..., Password_ n 과 같은 순서를 사용하지 못하도록 ). 이것은 일반 텍스트 암호로 사소한 것이지만 해시 만 저장하여 어떻게 할 수 있습니까?

다시 말해 안전한 암호 기록 메커니즘을 구현하는 방법은 무엇입니까?


2
관련 : security.stackexchange.com/questions/4704/… (그리고 BTW는 해당 사이트가이 질문에 대한 더 나은 위치 일 수 있습니다). '최소 변경'까지는 '최소 변경'(정의에 따라 LOT이 될 수 있음)으로 간주되는 모든 옵션을 생성하고 해시를 비교하는 대안을 생각할 수 없습니다. 'minimal change'의 정의는 무엇입니까?
케빈 베르메르

7
최신 n 개의 비밀번호를 저장 한다는 것은 사용자가 1에서 n + 1 까지의 시퀀스를 선택한다는 의미입니다 .
Joachim Sauer

11
나는 그러한 암호 정책이 보안을 향상 시킨다는 것에 회의적이다. IMHO는 사람들이 스티커 메모에 자신의 암호를 유지할 가능성을 높입니다. 케빈의 링크는 좋은 토론입니다. @KevinVermeer-실제로 "편집 거리"라고도하는 레 벤슈 테인 거리 ( en.wikipedia.org/wiki/Levenshtein_distance ) 로 변화량을 측정 할 수 있습니다 .
Nathan Long

5
보안이 엄격한 경우 사용자에 대한 임의의 암호를 생성하여 강제로 사용하고 정기적으로 변경하도록 할 수 있습니다. 그렇게하면 암호를 완전히 제어 할 수 있습니다.
Reactgular

2
@nathan : 스티커 메모에 암호를 저장하는 것이 실제로 안전합니다. 스티커 메모에 물리적으로 액세스하지 않으면 암호를 공격 할 수 없으므로 위협의 약 99 %가 제거됩니다. 이 메모를 지갑이나 지갑에 넣으면 기본적으로 사람을 습득해야 보안 위반이 확인되어 완화 될 수 있습니다.
mattnz

답변:


22

로그인 할 때 비밀번호를 확인하는 것과 같은 방식으로 해시를 저장하고 저장된 해시에 대해 입력 한 비밀번호를 확인하십시오. '최소'변경 사항을 감지하려면 숫자 패턴을 기반으로 주어진 비밀번호에서 '대체'비밀번호를 생성해야합니다.

로그인시 이미 해시에 대해 입력 한 비밀번호를 확인하면 비밀번호를 일반 텍스트로 저장할 필요가 없습니다. 비밀번호 변경과 관련하여 동일한 트릭이 작동합니다. 히스토리 해시와 비교하여 입력 및 '최소 변경'으로 생성 된 비밀번호를 확인하십시오. 새 비밀번호가 만족스러운 경우 현재 비밀번호 해시를 히스토리 세트로 이동하고 새 비밀번호의 새 해시로 바꾸십시오.


따라서 사용자가 Password6을 입력 하면 숫자 부분을 감지하고 예를 들어 Password4 , Password5 , Password7 등을 시도 해야합니다. 그 맞습니까?
Wizard79

4
@Lorenzo : 맞습니다. 대안을 생성하는 것은 원하는만큼 복잡 할 수 있습니다. 복잡성과 위험 간의 올바른 균형을 찾아야합니다 (위험 가능성이 사라질 가능성이있는 모든 가능성을 확인하면서 사용자가 5 분 동안 기다리지 않도록하십시오).
Martijn Pieters

나는 끝에 숫자를 요구하는 것이 사용자에게 좋은 제안이라는 것을 확신하지 못합니다-그것은 조금 예측 가능합니다. 사용자에게 그렇게 지시하면 기하 급수적으로 늘어납니다.
와이엇 바넷

2
@WyattBarnett : 아무도 사용자에게 그렇게 지시하지 않습니다. 요점은 사용자 가이를 감지 하고 '증가 된'비밀번호가 사용되지 않도록하는 것입니다.
Martijn Pieters

아, 여기에 뭔가 잘못 읽었습니다. 죄송합니다.
와이엇 바넷

28

사용자가 비밀번호를 변경하면 이전 비밀번호를 입력하도록 요청하십시오. 데이터베이스에 일반 텍스트 비밀번호를 저장하지 않더라도 이제 두 개의 일반 텍스트 비밀번호에 액세스 할 수 있습니다.

이 두 비밀번호에 대해 원하는 검증을 수행하십시오. 이렇게하면 사용자가 두 개의 비밀번호를 번갈아 사용하는 것을 막을 수는 없지만 접미사를 사용하면 다른 답변의 제안에 따라 직접 변경을 방지 할 수 있습니다.


당신에 대한 테스트의 요구 사항이없는 경우 음이 영리한 해결 방법은 확실히 N 이전 암호를 조금만 더 시간에 대안을 생성하지만 제안입니다. 그러나 두 비밀번호의 대안을 생성하는 것이 훨씬 좋습니다!
Wizard79

2
@Lorenzo : 아이디어는 n 개의 이전 비밀번호에 대해 직접 테스트하고 마지막 비밀번호에 대해 더 강력한 테스트를 수행한다는 것입니다. 타협입니다.
브라이언

예. 현재 비밀번호가 potatoSalad1이고로 업데이트하려는 경우 potatoSalad2해당 시점에 일반 텍스트 비밀번호가 모두 있으므로 변경 사항이 너무 작다는 것을 알 수 있습니다. 그러나 그것보다 더, 당신은 해시 만 가지고 있으며, 해시의 성격은 두 해시가 입력과 유사하거나 완전히 다른 일반 텍스트를 가지고 있는지 알 수 없다는 것입니다.
Nathan Long

7

@martijnPieter의 답변에 추가하려면 새 암호와 이전 암호 (둘 다 사용할 수 있음)를 기반으로 짧은 무차별 대입으로 최소한의 변화를 구현할 수 있습니다

예를 들어 새 비밀번호에서 해밍 거리 가 1 또는 2 인 모든 비밀번호를 반복 하여 이전 비밀번호와 일치하는지 확인할 수 있습니다.

그러나 이렇게하면 비밀번호를 해싱하고 있다는 사용자의 신뢰도가 떨어질 수 있습니다 (기본적으로 새 비밀번호를 거부하기 위해 이전 비밀번호를 다시 가져올 수 있음).


그러나 2012 년 2 월-> March2012 또는 Fri-09-28-12-> 화요일 11-27-12 (날짜), Password_Alpha-> Password_Beta, Pass_1111-> Pass_2222, Pass_qwer, Pass_tyui와 같이 해밍 거리가 더 큰 시퀀스가 ​​많이 있습니다. Pass, _op [], 또는 11-> 12 (대체 카운팅 시스템), 또는 FrankSmith-> FredJones-> FriarTuck 또는 분노-> 동물-> 사과 (회사 디렉토리의 이름 또는 사전의 단어) 이전 비밀번호는 쉽게 추측 할 수 있지만 알고리즘 생성이 매우 어려울 수 있습니다.
Kevin Vermeer

@KevinVermeer 그런 다음 변형 발생기의 사람들을 위해 계정, 당신은 모든 것을 얻을하지 않습니다 받아 들일
래칫 괴물

자신감 감소 +1 암호가 3 개월 전에 사용한 암호와 너무 비슷하다는 내용을 보았을 때 암호를 가역적으로 저장하는지 또는 멋진 프로그래머가 있는지 즉시 궁금합니다. 회의론이 승리합니다.
Tim Post

5

이것은 @Brian의 영리한 답변에 대한 추가 부록입니다. 또한 현재 암호를 기반으로 기존 암호를 무차별 처리하는 방법과 "해밍 거리"를 위해 @ratchet freak에 대한 세부 정보를 추가 한 @Martijn Pieters를 방문하십시오. 답변을 백업하는 데 흥미로운 배경을 제공한다고 생각하기 때문에 답변을 삭제하지 않습니다.

최신 암호 저장소에는 각 사용자마다 고유 한 솔트 (128 비트 +)를 가진 여러 라운드의 강력한 단방향 암호화 해시 (SHA-512 +)를 사용해야합니다. 그러나 각 비밀번호에 대한 추가 정보를 저장하려는 유혹을받지 마십시오. 각 비밀번호에 대해 더 많은 정보를 저장할수록 해시 알고리즘의 보안이 약화됩니다.

다음을 알고 있다면 암호를 무차별하게하는 것이 얼마나 쉬운 지 고려하십시오.

  • 길이는 7 자입니다
  • 문자 3-5는 대문자입니다 (4는 더 낮음)
  • 1과 7은 숫자입니다
  • 6은 상징이다

미국 키보드에는 인쇄 가능한 95 개의 문자가 있으므로 암호가 7 자임을 알고 있으면 95 ^ 7 = 69,833,729,610,000 = 7x10 ^ 13 순열이됩니다. 실제로 임의적이라면 단일 3Ghz 프로세서에서이를 해독하는 데 1 년이 걸릴 수 있습니다. 그러나:

  • 대문자 26 자 및 소문자 26 자만 있습니다
  • 이 두 숫자에 대해 100 개의 가능성을 산출하는 10 자리 숫자 만 있습니다
  • 32 개의 기호 만 있습니다

그래서 (@Hellion 덕분에 수정되었습니다) :

         26^4 (charcters 2-5 are known upper or lower-case)
        x 100 (characters 1 & 7 are digits)
        x  32 (character 6 is a symbol)
         ====
1,462,323,200 possible passwords.

균열하기 50,000 배가 더 쉽습니다! 이 경우 유사한 암호를 방지하기 위해 좋은 정보를 저장하면 1 년에서 몇 시간까지 7 자 암호의 균열 시간이 걸렸습니다. 좋은 비디오 카드와 약간의 인내심을 갖춘 강력한 멀티 프로세서 데스크탑에서 모든 암호를 해독하는 것이 가능해졌습니다. 이 간단한 예제를 통해 유사한 암호를보다 의미있게 비교할수록 해시의 보안 수준이 떨어집니다.

강력한 해싱의 중요성

비밀번호가있는 데이터베이스는 정기적으로 도난 당하며 매월 뉴스가 엄청나게 침입합니다. 지난달 SC 주정부는 모든 사람의 사회 보장 번호를 잃어 버렸습니다 . 이러한 위반 중 몇 개가 더 많이 포함됩니까?

결산 생각

나를 위해 가장 두려운 것은 사람들이 여러 사이트에 대해 동일하거나 유사한 암호를 선택하여 하나의 사이트로 침입하면 침입자가 모든 사이트에 액세스 할 수있게하는 것입니다. 가장 일반적인 잘못된 암호를 방지하면 개별 사용자가 동일한 사이트 내에서 잘못된 암호를 다시 사용하지 못하도록 방지하는 것보다 더 도움이된다고 생각하지만, 이러한 상황을 방지하는 입증 된 방법을보고 싶습니다. 내가 제안 할 수있는 최선의 방법은 각 사용자에 대해 매우 임의의 암호를 생성하고 안전하게 저장하는 보안 암호 관리자를 사용하는 회사 차원의 정책입니다.


1
minor nit : 암호 가능성은 여전히 ​​곱셈이므로 (26 ^ 4) * 100 * 32 = 1,462,323,200입니다. 균열 가능성 (95 ^ 7)에 1 년이 걸린다고 가정하면이 적은 수의 균열에 약 11 분이 걸립니다.
Hellion

@Hellion-죄송합니다! 지적 해 주셔서 감사합니다. 수정했습니다.
GlenPeterson

1

먼저, 마지막 "n"이전 비밀번호에 대한 해시를 저장할 수 있으므로 새 비밀번호가 이전 비밀번호와 중복되는지 확인할 수 있습니다. 또한 현재 비밀번호의 일반 텍스트 (비밀번호 변경 요청을 인증하기 위해 로그인 또는 비밀번호를 제공했기 때문에) 및 새 비밀번호가 있으므로이 두 비밀번호 사이의 최소 변경 사항을 확인할 수 있습니다.

이 두 암호를 "n"이전 암호와 직접 비교하는 것이 매우 중요하다면 나중에 검색 할 수 있도록이 암호를 저장 (암호화)해야합니다.

이를 수행하기위한 보안 결함으로 볼 수 있지만 충분한 보안을 제공하기 위해 암호화 방법을 구현할 수 있습니다.

  1. 마지막 "n"비밀번호에 대해 각 비밀번호 (암호화)를 저장하십시오.
  2. 가장 최근 비밀번호가 작성된 날짜 및 시간을 저장하십시오.
  3. 최신 비밀번호의 해시를 저장하십시오.
  4. 현재 비밀번호의 해시 (염색 된) 및 비밀번호 작성 시간 소인 및 아마도 계정 번호 또는 이메일 주소를 사용하여 모든 비밀번호를 암호화하십시오.
  5. 새 비밀번호가 작성 될 때마다 모든 비밀번호를 암호화 해제하고 다시 암호화하십시오.

그런 다음 비밀번호가 변경 될 때마다 이전 비밀번호를 모두 암호화 해제하고 모든 최소 변경 테스트를 수행 할 수 있습니다.

이제 누군가가이 사람의 암호를 가지고 있고 필요한 다른 모든 세부 사항을 알고 있다면이 사람의이 정보를 해독 할 수 있습니다. 그러나 이미이 사람의 암호를 가지고 있다면 이미이 사람으로 로그인하여이 사람의 계정에 액세스 할 수 있습니다.

또한 이전 비밀번호의 경우 엄격하게 일반 텍스트로 저장하지 않아도됩니다. 모호한 방식으로 저장 될 수 있습니다. 또는 비밀번호의 알파벳 문자 목록으로 저장됩니다.

나는 이것이 일반적인 경우에 권장되는 일이라고 말하지는 않지만, 당신이 묘사 한 작업이 귀하의 경우에 필요하다고 가정하면, 이것은 일부 보안 조치로 그것을 달성하는 한 가지 방법입니다.


이 답변은 보안 측면에서 몇 가지 끔찍한 제안을합니다. 우리는 암호를 쉽게 해독하거나 강하게 암호화하는 대신 "난독 한 방식으로"저장할 수 없어야합니다.
user45623
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.