A "senha mais forte"

11

Eu tenho um aplicativo protegido por um PIN de quatro dígitos e o usuário teve cinco tentativas de fazer login antes de a conta ser bloqueada.

Agora, um dos meus clientes deseja "fortalecer" a segurança e advogar por outra solução:

  • PIN de seis dígitos
  • NÃO "mesmo dígito um ao lado do outro": por exemplo: 11 3945 ou 39 55 94
  • NÃO "números de três dígitos": por exemplo: 123 654 ou 53 789 3

Agora, à pergunta: qual solução é a mais forte?

Posso calcular os quatro dígitos com bastante facilidade, mas como faço para calcular o outro?

Obrigado!

Atualizar

Você obtém o que pede - especialmente quando trabalha com matemática :)

Então, o que eu estava pedindo era o número de combinações para as duas seqüências numéricas.

Lendo as respostas e comentários, ficou claro para mim que isso realmente não importa. Se você tem cinco palpites, não importa se você tem 10.000 ou ~ 800.000 para escolher. Mais importante é descartar 1234 e dia do nascimento. Na minha situação, na verdade, tenho o dia do nascimento dos usuários, portanto, tenho algo para verificar.

Obrigado por uma ótima discussão!

Casper Jensen
fonte
4
Tendo uma perspectiva histórica, você deve se familiarizar com a análise criptográfica da máquina Enigma. Em particular, o algoritmo Enigma nunca criptografou uma carta para si mesmo. Isso foi pensado para torná-lo mais seguro por seus engenheiros, mas teve o efeito de tornar a máquina drasticamente menos segura. Este foi um dos muitos passos que permitiram aos Poderes Aliados quebrar o Enigma. Eu não sou especialista em criptografia de forma alguma, mas a noção geral é que você deseja que seu espaço de chaves seja o maior possível.
Sycorax diz Restabelecer Monica
2
Eu acho que isso pertence à criptografia , não aqui.
gung - Restabelece Monica
2
Casper, por favor, esclareça - você está preocupado principalmente com isso como um problema de segurança (por exemplo, há considerações relacionadas a mais do que apenas probabilidade); nesse caso, pode ser um ajuste melhor em outro lugar - ou você está fazendo uma pergunta principalmente de probabilidade (que se encaixa aqui)?
Glen_b -Reinstala Monica
3
Teoricamente - se você se concentra apenas em ataques de força bruta - mais possibilidades significa mais segurança; portanto, restrições como o número sem o mesmo dígito ou a série 3 não reduzem o número de possibilidades e, portanto, são estritamente mais fracas. No entanto, praticamente (quando o user777 toca) as pessoas não estão escolhendo pinos aleatórios. Se os usuários são mais preguiçosos do que paranóicos, muitos deles podem escolher pinos como "000000" ou "123456", o que torna as coisas menos seguras.
Gregor Thomas
2
Estou a votar (temporariamente) para encerrar esta questão como pouco clara, porque as intenções do OP ainda não são óbvias. Eu realmente preferiria responder à pergunta de @ Glen_b, para sabermos se isso deve ser tratado como uma questão combinatória / de probabilidade ou como algo que é melhor migrado.
Silverfish

Respostas:

8

Você solicitou ajuda a um fórum de estatísticos sobre esta questão, por isso fornecerei uma resposta baseada em estatística. Portanto, é razoável supor que você esteja interessado na probabilidade de adivinhar um PIN aleatoriamente (para alguma definição de aleatório), mas isso está lendo mais a questão do que é fornecido.

Minha abordagem será enumerar todas as opções possíveis sem restringir e subtrair as opções nulas. Isso tem um canto agudo, chamado de princípio de inclusão-exclusão, que corresponde à idéia intuitiva de que você não deseja subtrair a mesma coisa de um conjunto duas vezes!

Em um PIN de seis dígitos sem restrições e em um sistema de número decimal, existem combinações possíveis, de a cada dígito tem 10 opções.106000000999999:

Considere a aparência de "dois dígitos adjacentes e idênticos": , onde as posições rotuladas como são iguais e pode ser qualquer dígito decimal. Agora considere quantas outras maneiras a sequência pode ser organizada em seis dígitos: , , e . Portanto, para qualquer pedido em particular (uma dessas opções), há pelo menos combinações, pois há dígitos sem restrição. Agora, quantas opções de existem? Estamos trabalhando com dígitos decimais, portanto deve haver 10. Portanto, existemAAXXXXAXAAXAAXXXXXAAXXXXXAAXXXXXAA104104A105opções para um pedido específico. Existem cinco ordens desse tipo; portanto, existem arranjos que atendem a essa definição. (O que isso significa em termos de segurança pode ser medido em termos de uma medida teórica da informação de quanto isso reduz a entropia do espaço do PIN.)5×105

Agora considere como são os números consecutivos. Na cadeia , se conhecemos A, também conhecemos B e C *: se A é 5, B é 6 e C é 7. Portanto, podemos enumerar essas opções:ABCXXX

  • 012XXX
  • 123XXX
  • 234XXX
  • 456XXX
  • 789XXX

e, neste momento, não está claro se há um "envolvimento". Se houver, também incluímos

  • 890XXX
  • 901XXX

Cada solução possui combinações associadas, pelo mesmo raciocínio que acima. Portanto, conte quantas soluções devem existir. Lembre-se de contar pedidos alternativos, como103XABCXX.

Agora chegamos ao canto agudo, que é o princípio de inclusão-exclusão. Transformamos o conjunto de todos os PINs de seis dígitos em três conjuntos:

A. PINs permitidos B. PINs inválidos devido a "dígitos adjacentes" C. PINs inválidos devido a "dígitos sequenciais"

C | S | = | Um | - | B | - | C | ,BC|S|=|A||B||C|,|S|=|A||B||C|+|BC|,BCBCBC

Existem várias maneiras de isso ocorrer:

  • AABCXX
  • ABCXDD

Abordagens um pouco mais avançadas tirariam proveito dos resultados combinatórios básicos e do teorema fundamental da contagem, mas eu escolhi essa avenida, pois coloca a menor carga técnica no leitor.

1|S|

As rugas de "cinco até o bloqueio" são decididamente a melhor proteção contra o acesso não autorizado, pois no esquema de 4 ou 6 dígitos, há um número muito grande de opções e até cinco suposições aleatórias diferentes têm um baixo probabilidade de sucesso. Para uma pergunta de probabilidade bem posta, é possível calcular a probabilidade de um ataque desse tipo ter sucesso.

Mas outros fatores além da probabilidade de sequências de números podem influenciar a segurança do mecanismo de PIN. Principalmente, as pessoas tendem a não escolher PINs aleatoriamente! Por exemplo, algumas pessoas usam sua data de nascimento, data de nascimento dos filhos ou algum número similarmente relacionado pessoal como um PIN. Se um invasor conhece o DOB ​​do usuário, provavelmente estará entre as primeiras coisas que tentar. Portanto, para um usuário específico, algumas combinações podem ser mais prováveis ​​que outras.

* As seqüências listadas estão aumentando estritamente e não está claro se elas aumentam e diminuem quando você diz "número de três corridas".

Sycorax diz restabelecer Monica
fonte
1

A obtenção de uma fórmula fechada parece complexa. No entanto, é bastante fácil enumerá-los. Existem 568 916códigos possíveis para a segunda solução. Maior que o número de soluções com um código PIN de quatro dígitos. O código para enumerá-los está abaixo. Embora não seja otimizado, leva apenas alguns segundos para ser executado.

Nota. Presumi que a sequência tivesse que estar em ordem crescente (que pode ser facilmente modificada three_running)

N = 999999

candidates = range(N)

def same_consecutive_digits(x):
    x_string = str(x).zfill(6)
    for i in range(1,len(x_string)):
        if x_string[i] == x_string[i-1]:
            return True
    return False

def three_running(x):
    x_string = str(x).zfill(6)
    for i in range(2,len(x_string)):
        if int(x_string[i]) == int(x_string[i-1]) + 1 and int(x_string[i-1]) == int(x_string[i-2]) + 1:
            return True
    return False

def valid(x):
    return not same_consecutive_digits(x) and not three_running(x)

assert(same_consecutive_digits(88555))
assert(same_consecutive_digits(123))
assert(not same_consecutive_digits(852123))
assert(three_running(123456))
assert(not three_running(4587))
assert(valid(134679))
assert(not valid(123894))
assert(not valid(111111))
assert(not valid(151178))
assert(valid("031278"))

accepted = [i for i in range(N) if valid(i)]
print(len(accepted))
RUser4512
fonte
Está implícito no código, mas não na sua descrição, a suposição de que os PINs nunca começarão com o dígito "0". Isso geralmente não acontece com PINs ou senhas. A resposta correta, permitindo esses zeros, é 568.916. Porém, tenha em mente que a resposta relevante consideraria que os ataques ao PIN nesse problema restrito podem ser muito mais eficientes explorando as restrições, o que implica que essa mera enumeração de possibilidades não representa adequadamente a "força" de sistema, conforme apontado nos comentários à pergunta.
whuber