비밀번호의 엔트로피를 어떻게 추정 할 수 있습니까?


14

암호 강도에 대한 다양한 리소스 를 읽은 후 암호의 엔트로피 양을 대략적으로 추정하는 알고리즘을 만들려고합니다.

가능한 포괄적 인 알고리즘을 만들려고합니다. 이 시점에서 나는 의사 코드 만 가지고 있지만 알고리즘은 다음을 다룹니다.

  • 비밀번호 길이
  • 반복되는 문자
  • 패턴 (논리)
  • 다른 문자 공간 (LC, UC, 숫자, 특수, 확장)
  • 사전 공격

다음 내용은 다루지 않으며 잘 다루어야합니다 (완전하지는 않지만).

  • 순서화 (암호는이 알고리즘의 출력에 의해 엄격하게 순서화 될 수 있음)
  • 패턴 (공간)

누구나이 알고리즘이 약한 것에 대한 통찰력을 제공 할 수 있습니까? 특히, 암호를 알고리즘에 제공하는 것이 그 강도를 과대 평가 하는 상황을 생각할 수 있습니까? 과소 평가는 문제가되지 않습니다.

알고리즘 :

// the password to test
password = ?
length = length(password)

// unique character counts from password (duplicates discarded)
uqlca = number of unique lowercase alphabetic characters in password
uquca = number of uppercase alphabetic characters
uqd   = number of unique digits
uqsp  = number of unique special characters (anything with a key on the keyboard)
uqxc  = number of unique special special characters (alt codes, extended-ascii stuff)

// algorithm parameters, total sizes of alphabet spaces
Nlca = total possible number of lowercase letters (26)
Nuca = total uppercase letters (26)
Nd   = total digits (10)
Nsp  = total special characters (32 or something)
Nxc  = total extended ascii characters that dont fit into other categorys (idk, 50?)

// algorithm parameters, pw strength growth rates as percentages (per character)
flca = entropy growth factor for lowercase letters (.25 is probably a good value)
fuca = EGF for uppercase letters (.4 is probably good)
fd   = EGF for digits (.4 is probably good)
fsp  = EGF for special chars (.5 is probably good)
fxc  = EGF for extended ascii chars (.75 is probably good)

// repetition factors.  few unique letters == low factor, many unique == high
rflca = (1 - (1 - flca) ^ uqlca)
rfuca = (1 - (1 - fuca) ^ uquca)
rfd   = (1 - (1 - fd  ) ^ uqd  )
rfsp  = (1 - (1 - fsp ) ^ uqsp )
rfxc  = (1 - (1 - fxc ) ^ uqxc )

// digit strengths
strength =
( rflca * Nlca + 
  rfuca * Nuca +
  rfd   * Nd   +
  rfsp  * Nsp  +
  rfxc  * Nxc    ) ^ length

entropybits = log_base_2(strength)

몇 가지 입력과 원하는 실제 entropy_bits 출력 :

INPUT           DESIRED        ACTUAL
aaa             very pathetic  8.1
aaaaaaaaa       pathetic       24.7
abcdefghi       weak           31.2
H0ley$Mol3y_    strong         72.2
s^fU¬5ü;y34G<   wtf            88.9
[a^36]*         pathetic       97.2
[a^20]A[a^15]*  strong         146.8
xkcd1**         medium         79.3
xkcd2**         wtf            160.5

* these 2 passwords use shortened notation, where [a^N] expands to N a's.
** xkcd1 = "Tr0ub4dor&3", xkcd2 = "correct horse battery staple"

이 알고리즘은 알파벳 크기 (1 자리 숫자까지)를 늘리면 6 번째와 7 번째 비밀번호에 대한 엔트로피 비트의 차이가 36a로 구성되지만 두 번째는 21a는 대문자. 그러나 그들은 36 a의 암호를 갖는 것이 좋은 생각이 아니며, 약한 암호 크래커 (그리고 당신이 그것을 보는 사람은 그것을 볼 것입니다)로 쉽게 깨졌으며 알고리즘은 그것을 반영하지 않는다는 사실을 설명하지 않습니다. .

그러나 복잡도 밀도가 더 높음에도 불구하고 xkcd1이 xkcd2에 비해 취약한 암호라는 사실을 반영합니다 (이것도 문제입니까?).

이 알고리즘을 어떻게 개선 할 수 있습니까?

부록 1

사전 공격과 패턴 기반 공격이 가장 큰 것처럼 보이므로이를 해결하는 데 도움이 될 것입니다.

단어 목록의 단어에 대한 암호를 통해 포괄적 인 검색을 수행하고 단어를 해당 단어가 나타내는 고유 토큰으로 바꿀 수 있습니다. 그런 다음 단어 토큰은 문자로 취급되고 자체 가중치 시스템이 있으며 비밀번호에 자체 가중치를 추가합니다. 몇 가지 새로운 알고리즘 매개 변수가 필요합니다 (lw, Nw ~ = 2 ^ 11, fw ~ = .5 및 rfw라고 부릅니다). 나는 다른 알고리즘과 마찬가지로 가중치를 암호로 고려합니다. 무게.

이 단어 검색은 소문자와 대문자뿐만 아니라 3을 사용하는 일반적인 문자 대체와 일치하도록 특별히 수정할 수 있습니다. 일치하는 단어에 가중치를 추가하지 않으면 알고리즘이 강도를 약간 과소 평가합니다. 또는 단어 당 2 개 (정상)입니다. 그렇지 않으면, 일반적이지 않은 각 문자 일치에 대해 단어에 보너스 비트를 부여하는 것이 일반적인 규칙입니다.

그런 다음 반복 된 문자 실행 및 파생 테스트 (각 문자 간의 차이를 취)와 같은 간단한 패턴 검사를 수행하여 'aaaaa'및 '12345'와 같은 패턴을 식별하고 감지 된 각 패턴을 패턴으로 대체 할 수 있습니다. 패턴과 길이에 고유 한 토큰. 알고리즘 파라미터 (특히, 패턴 당 엔트로피)는 패턴에 기초하여 즉석에서 생성 될 수있다.

이 시점에서 암호 길이를 사용합니다. 각 단어 토큰과 패턴 토큰은 하나의 문자로 계산됩니다. 각 토큰은 상징적으로 나타내는 문자를 대체합니다.

일종의 패턴 표기법을 만들었지 만 패턴 길이 l, 패턴 차수 o 및 기본 요소 b를 포함합니다. 이 정보는 각 패턴에 대한 임의의 가중치를 계산하는 데 사용될 수 있습니다. 실제 코드에서 더 나은 것을 할 것입니다.

수정 된 예 :

Password:          1234kitty$$$$$herpderp
Tokenized:         1 2 3 4 k i t t y $ $ $ $ $ h e r p d e r p
Words Filtered:    1 2 3 4 @W5783 $ $ $ $ $ @W9001 @W9002
Patterns Filtered: @P[l=4,o=1,b='1'] @W5783 @P[l=5,o=0,b='$'] @W9001 @W9002

Breakdown:         3 small, unique words and 2 patterns
Entropy:           about 45 bits, as per modified algorithm

Password:          correcthorsebatterystaple
Tokenized:         c o r r e c t h o r s e b a t t e r y s t a p l e
Words Filtered:    @W6783 @W7923 @W1535 @W2285

Breakdown:         4 small, unique words and no patterns
Entropy:           43 bits, as per modified algorithm

엔트로피가 패턴으로부터 어떻게 계산되는지에 대한 정확한 의미론은 논의의 대상입니다. 나는 다음과 같은 것을 생각하고 있었다 :

entropy(b) * l * (o + 1) // o will be either zero or one

수정 된 알고리즘은 s^fU¬5ü;y34G<단어 나 패턴이없는을 제외하고 원래 테이블의 각 비밀번호에 결함이 있고 강도를 줄 입니다.


2
당신은 본 적이 tech.dropbox.com/?p=165 ? 그것은 당신에게 몇 가지 아이디어를 줄 수 있습니다. dl.dropbox.com/u/209/zxcvbn/test/index.html에 데모가 있으며 코드는 github에 있습니다.


하나의 옵션은 압축 알고리즘을 통해 실행하고 압축 얼마나 잘 볼 수 있습니다, 여기에 유일한 캐치는 대부분의 압축 algos 많은 양의 데이터로 작업하는 디자이너들은이 적은 양의 데이터를 하나의 필요가있다이다
JK합니다.

1
@mouviciel : 나는 당신을 펀치로 이겼습니다. 첫 줄을 읽으십시오 : D
Wug

@Wug-좋아! 나는 그 링크를 따르지 않았다. 다양한 자료 가 그런 종류의 연구를 다루었다고 상상할 수 없었다 !
mouviciel

답변:


9

NIST SP 800-63 p46의 부록 A 는 는 여러 비트를 사용하여 암호 엔트로피를 추정 Claude Shannon . 실제로 이것은 XKCD 만화가 엔트로피 비트를 계산하는 데 사용하는 문서입니다. 구체적으로 특별히:

  • 제 1 문자의 엔트로피는 4 비트로 취해지고;
  • 다음 7 개의 문자의 엔트로피는 문자 당 2 비트이며; 이것은 "8 자 이하로 확장되는 통계적 효과가 엔트로피가 문자 당 대략 2.3 비트 인 것으로 간주 될 때"의 Shannon의 추정과 대략 일치한다.
  • 9 번째부터 20 번째 문자까지 엔트로피는 문자 당 1.5 비트로 간주됩니다.
  • 문자 21 이상에서는 엔트로피가 문자 당 1 비트로 간주됩니다.
  • 6 비트 엔트로피의 "보너스"는 대문자와 알파벳이 아닌 문자가 모두 필요한 구성 규칙에 할당됩니다. 이렇게하면 이러한 문자를 강제로 사용하지만 대부분의 경우 문자는 비밀번호의 시작 또는 끝에서만 발생하며 전체 검색 공간이 다소 줄어들 기 때문에 이점은 보통의 길이와 거의 무관합니다. 암호;
  • 광범위한 사전 검사를 위해 최대 6 비트의 엔트로피 보너스가 추가됩니다. 공격자가 사전을 알고 있으면 해당 비밀번호 테스트를 피할 수 있으며 어떤 경우에도 사전을 많이 추측 할 수 있지만 사전 규칙이없는 경우 가장 많이 선택된 비밀번호가됩니다. 기억할 수있는 긴 비밀번호는 반드시 사전 단어로 구성된 "패스 프레이즈"여야하므로 보너스는 20에서 0으로 감소하기 때문에 사전 테스트에 대한 대부분의 추측 엔트로피 이점은 비교적 짧은 비밀번호에 발생한다고 가정합니다. 문자.

아이디어는 인증 시스템이 특정 엔트로피 레벨을 임계 값으로 선택한다는 것입니다. 예를 들어, 10 비트는 약하고, 20 개 중간 및 30 개는 강력 할 수 있습니다 (추천이 아니라 임의로 임의의 수를 선택 함). 불행히도, 문서는 이러한 임계 값을 권장하지 않습니다. 아마도 암호를 무차별 적으로 추측하거나 추측 할 수있는 계산 능력이 시간이 지남에 따라 증가하기 때문일 것입니다.

임의의 특정 규칙 집합을 적용하는 대신 인증 시스템은 위에서 언급 한 규칙을 사용하여 사용자 암호를 등급 지정하고 최소 엔트로피 표준을 충족하는 암호를 허용 할 수 있습니다. 예를 들어, 엔트로피가 24 비트 이상인 암호가 필요하다고 가정하십시오. 문자열에 23 개의 문자가 있고 대문자와 알파벳이 아닌 문자를 요구하는 작성 규칙을 만족한다는 것을 관찰하여“Pin4의 IamtheCapitan의 엔트로피 추정값을 계산할 수 있습니다.

이것은 당신이 찾고있는 것일 수도 있고 아닐 수도 있지만, 다른 것이 없다면 나쁜 참조 점이 아닙니다.

[편집 : 다음을 추가했습니다.]

종이 공개 암호 대량의 공격에 의해 암호 생성 정책에 대한 테스트 메트릭 (마 위어, 수 디르 아 가르 왈, 마이클 콜린스와 헨리 스턴에 의해가), 섀넌 모델을 보여 위에서 설명한 인간 생성 된 암호에 대한 엔트로피의 정확한 모델이 아니다. 보다 정확한 제안을 보려면 "섹션 5 새 비밀번호 생성 정책 생성"을 참조하십시오.


3
암호 강도에 관한 Wikipedia 기사에는 이러한 규칙이 사람이 생성 한 암호에 대해 정확하지 않은 것으로 밝혀졌습니다.
Ryathal

1
참 ( 흥미로운 독서를위한 goo.gl/YxRk ).
akton

물론 이것에는 하나의 경고가 있습니다. 사람들이 사람이기 때문에 특정 규칙을 따르는 경향이있는 통계적으로 일반적인 암호의 경우 상당히 정확할 수 있습니다. 이 가이드 라인은 무작위로 생성 된 비밀번호가 패턴과 단어를 포함하지 않기 때문에 일반적인 길이에서 사람이 생성 한 비밀번호를 훨씬 능가한다는 사실을 고려하지 않습니다.
Wug

4

이 페이지 하단에서 KeePass 의 소스 코드를 확인 하십시오 . 이 QualityEstimation클래스는 당신이 찾고있는 것과 일치하는 것처럼 보이는 멋진 알고리즘을 구현합니다. 내 결과는 다음과 같습니다.

aaa                              8
aaaaaaaaa                        9
abcdefghi                       18
H0ley$Mol3y_                    73
s^fU¬5ü;y34G<                   99
[a^36]*                         10
[a^20]A[a^15]*                  18
Tr0ub4dor&3                     66
correct horse battery staple    98

이것은 엔트로피 또는 아마도 bogofitness와 같은 다른 메트릭을 계산합니까? 또한 [a ^ 36]을 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'로 확장하는 것을 기억하십니까?
Wug

어, 아니, 나는 그 문자열을 그대로 복사했다. .
제시 C. 슬라이서

1
이상한 표기법만큼 규칙적인 표현은 아니 었습니다. 25 자 정도 내 테이블을 꾸미지 않아도되는 데 사용했습니다
Wug

2
나는 'enfatten'에 대한 논평을 +1해야했다. 이 상황에서는 완벽하게 끔찍한 단어처럼 보입니다.
Jesse C. Slicer

1
실제로는 "KeyPass"대신 "KeePass"라는 철자가 있습니다. (저는 직접 편집을했지만 6 자 이상이되어야합니다 ...)
Ian Dunn

1

물어

특히, 암호를 알고리즘에 제공하는 것이 그 강도를 과대 평가하는 상황을 생각할 수 있습니까?

그러나 그 질문에 대한 예가 있습니다. 설계 상 xkcd2의 엔트로피는 ~ 44 비트이지만 추정치는 160.5 비트입니다.


따라서 일반화하면 알고리즘은 다른 단어보다 상당히 사용되는 단어 또는 문자 조합을 고려할 때 분류됩니다. 또한 표준 xkcd 예제에 공백이 포함되어 있지 않으며 계산에 포함되어 있음을 지적합니다.
Wug

@ Wug, 그것은 공정한 일반화입니다. 이 질문에 대한 첫 번째 주석에서 언급 된 zxcvbn이 다루는 것입니다.
피터 테일러

1

누구나이 알고리즘이 약한 것에 대한 통찰력을 제공 할 수 있습니까? 특히, 암호를 알고리즘에 제공하는 것이 그 강도를 과대 평가하는 상황을 생각할 수 있습니까?

프리앰블에서 일부를 암시했습니다 (사전 공격 등). 기본적으로 공격자가 추측 할 수있는 여러 가지 일반적인 방법이 있으며 검색 공간을 크게 낮 춥니 다. 귀하의 알고리즘이 다음을 "과대 평가"할 것이라고 확신합니다.

  • 어디에나
  • 어디에나
  • 어디에나 1

암호는 상당히 길지만 원래 단어가 기본 사전에 나타나기 때문에 사소한 해독이 가능하며 수정은 적절한 사전 공격의 일부를 형성하기에 충분히 일반적으로 간주됩니다. 일반적인 문자-> 숫자 변환 (예 : 3v3rywh3r3)도 매우 약한 것으로 간주되며 이에 대한 처벌을 받아야합니다.

훨씬 적은 정도로, 다른 문제가있는 암호는 다음과 같이 명백한 패턴을 가진 암호 일 수 있습니다.

  • abcdefghijklmnop
  • abcde12345

이것들은 실제 사전 공격을 목표로 삼을 가능성이 적지 만 "aaaaa ..."예제와 유사한 문제로 고통받습니다.

비밀번호 문구가 현재 대부분의 사전 공격에서 타겟팅되는지 확실하지 않지만 인기를 얻음에 따라 점점 더 많이 타겟팅 될 것입니다. 유명한 xkcd 예제는 이것을 각각의 "공통 단어"에 11 비트 만 할당하기 때문에 이것을 고려한다고 생각합니다. 알고리즘은 이러한 유형의 비밀번호도 과대 평가합니다.

요약하자면, 알고리즘은 추정을 상당히 잘 수행하지만 암호의 구조와 알려진 일반적인 패턴을 고려해야합니다.


한 단계의 미분 검사는 이러한 모든 패턴을 식별합니다.
Wug
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.