Pergunta

Junte-me na luta contra o fraco hashes de senha.

Um PBKDF2 hash de senha deve conter o sal, o número de iterações, e o hash em si, portanto, é possível verificar mais tarde.Existe um formato padrão, como RFC2307 do {SSHA}, para PBKDF2 hashes de palavra-passe?BCRYPT é grande, mas PBKDF2 é mais fácil de implementar.

Aparentemente, não há nenhuma especificação.Então aqui está a minha spec.

>>> from base64 import urlsafe_b64encode
>>> password = u"hashy the \N{SNOWMAN}"
>>> salt = urlsafe_b64decode('s8MHhEQ78sM=')
>>> encoded = pbkdf2_hash(password, salt=salt)
>>> encoded
'{PBKDF2}1000$s8MHhEQ78sM=$hcKhCiW13OVhmLrbagdY-RwJvkA='

Atualização: http://www.dlitz.net/software/python-pbkdf2/ define um crypt() substituição.Eu atualizei o meu pequeno spec para coincidir com a sua, exceto ele começa com $p5k2$ em vez de {PBKDF2}.(Eu tenho necessidade de migrar de outras LDAP estilo {ESQUEMAS}).

O que é {PBKDF2}, o número de iterações em letras minúsculas hexadecimal, $, o urlsafe_base64 codificado sal, $, e o urlsafe_base64 codificado PBKDF2 de saída.O sal deve ser de 64 bits, o número de iterações deve ser de pelo menos 1000, e o PBKDF2 com HMAC-SHA1 de saída pode ser de qualquer comprimento.Na minha implementação é sempre de 20 bytes (o tamanho de um hash SHA-1) por padrão.

A senha deve ser codificado em utf-8 antes de serem enviados através PBKDF2.Nenhuma palavra sobre se ele deve ser normalizado em Unicode NFC.

Este esquema deve ser da ordem de iterations vezes mais caro para a força bruta do que {SSHA}.

Foi útil?

Solução

Há uma especificação para o parâmetros (sal e iterações) do PBKDF2, mas não inclui o hash. Isso está incluído em PKCS #5 versão 2.0 (Ver Apêndice A.2). Algumas plataformas possuem suporte interno para codificar e decodificar essa estrutura ASN.1.

Como o PBKDF2 é realmente uma função de derivação -chave, não faz sentido especificar uma maneira de agrupar o "hash" (que é realmente uma chave derivada) juntamente com os parâmetros de derivação - em uso normal, a chave deve permanecer segredo e nunca é armazenado.

Mas, para uso como hash de senha unidirecional, o hash pode ser armazenado em um registro com os parâmetros, mas em seu próprio campo.

Outras dicas

Eu vou acompanhá-lo na luta contra o fraco hashes.

OWASP tem uma Senha de Armazenamento de Cheat Sheet (https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet) com alguma orientação;eles recomendam que 64.000 PBKDF2 iterações mínimo de 2012, dobrando a cada dois anos (i.e.90,510 em 2012).

Note que um armazenamento de um tempo, criptograficamente aleatória de sal por userid é sempre básica.

Observe que a necessidade de uma amplamente variável por userid número de iterações e armazenar o número de iterações, juntamente com o sal irá adicionar um pouco de complexidade para craqueamento de software, e pode ajudar a impedir determinadas otimizações.Por exemplo, "bob" é criptografada com 135817 iterações, enquanto que "alice" usa 95,121 iterações, i.é.talvez um mínimo de(90510 + RAND(90510)) para 2013.

Note, também, que tudo isso é inútil, se os usuários estão autorizados a escolher senhas fracas, como "senha", "Password1!", "P@$$w0rd", e "P@$$w0rd123", tudo o que vai ser encontrado por regras baseadas ataques de dicionário, muito rapidamente, de fato (o último é simplesmente "senha" com as seguintes regras:letras maiúsculas a primeira letra, 1337-falar, adicionar um número de três dígitos para o final).Fazer um dicionário da lista (phpbb, por um bom e pequeno starter wordlist) e aplicar regras como essa, para ele, e você vai quebrar um grande número de palavras-passe onde as pessoas tentam "inteligente" truques.

Portanto, quando a verificação de novas palavras-chave, não apenas aplicar "Todos os quatro superiores, inferiores número de dígitos, pelo menos, de 11 caracteres", já que "P@$$w0rd123" está em conformidade com este aparentemente muito resistente regra.Em vez disso, uso básico lista de dicionários e ver se regras básicas iria quebrá-la (é muito mais simples do que realmente tentando um crack que você pode baixa-caso a sua lista e a sua palavra, e, em seguida, basta escrever código como "se o último de 4 caracteres são comuns ano, verifique todos, mas os últimos quatro caracteres contra a wordlist", e "se os últimos 3 caracteres são dígitos, verifique todos, mas os últimos 3 caracteres contra a wordlist" e "verificação de todos, mas os dois últimos caracteres contra a wordlist" e "De-1337 a palavra - passe activar @'s em um, de 3 em e, e assim por diante, e, em seguida, compare-o com a wordlist e tente as outras regras."

Na medida frases ir, em geral, são uma ótima idéia, especialmente se alguns outros caracteres são adicionados ao meio de palavras, mas se, e somente se, eles são longos o suficiente, já que você está dando um monte de combinações possíveis.

Note que máquinas modernas com GPU são de até dezenas de bilhões de hash iterações (MD5, SHA1, SHA-256, SHA-512, etc.) por segundo, mesmo em 2012.Tão longe como a combinação de palavras "correto cavalo bateria de grampos" tipo de senhas, este é um muito modesto senha de apenas 4 letras minúsculas todas as palavras em inglês de comprimento de 7 ou menos com espaços.Então, se formos olhar para o XKCD estilo de senhas, com 18 bilhões acho que um segundo programa de configuração:Um moderno dicionário de inglês americano tem:6k palavras de comprimento 5 ou menos 21k palavras de comprimento de 7 ou menos 36 mil palavras de comprimento de 9 ou menos 46k palavras de comprimento de 11 ou menos 49k palavras de comprimento de 13 anos ou menos

Com um XKCD estilo senha, e sem se preocupar em filtro de palavras por popularidade ("correto" vs."de cadeira" vs."dumpier" vs."hemorragia") temos 21k^4, que é apenas cerca de 2E17 possibilidades.Com os 18 mil milhões de euros/s de instalação (uma única máquina com 8 GPU se nós estamos enfrentando uma única SHA1 iteração), que é cerca de 4 meses, de forma exaustiva pesquisa o espaço.Se tivéssemos dez tais configurações, que é cerca de duas semanas.Se excluíssemos improvável palavras como "dumpier", o que é muito mais rápido, para uma rápida primeira passagem.

Agora, se você receber palavras de um "enorme" linux inglês americano wordlist, como "Balsamina" ou "Calvinistically" (ambos escolhidos por meio de "ir para a linha" recurso" e, em seguida, gostaríamos de ter 30k palavras de comprimento 5 ou menos 115k palavras de comprimento de 7 ou menos 231k palavras de comprimento de 9 ou menos 317k palavras de comprimento de 11 ou menos 362k palavras de comprimento de 13 anos ou menos

Mesmo com as 7 comprimento máximo limite, com este enorme dicionário como base e escolhido aleatoriamente palavras, temos 115 k^4 ~= 1.8E20 possibilidades, ou cerca de 12 anos, se o programa de configuração é mantido até à data (duplicação no poder a cada 18 meses).Isso é extremamente semelhante a uma de 13 caracteres, minúsculas + número da senha."300 anos" é o que a maioria das estimativas vão dizer a você, mas eles não conseguem levar a Lei de Moore em conta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top