암호 강도에 대한 다양한 리소스 를 읽은 후 암호의 엔트로피 양을 대략적으로 추정하는 알고리즘을 만들려고합니다.
가능한 포괄적 인 알고리즘을 만들려고합니다. 이 시점에서 나는 의사 코드 만 가지고 있지만 알고리즘은 다음을 다룹니다.
- 비밀번호 길이
- 반복되는 문자
- 패턴 (논리)
- 다른 문자 공간 (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<
단어 나 패턴이없는을 제외하고 원래 테이블의 각 비밀번호에 결함이 있고 강도를 줄 입니다.