Como me tornei um gerenciador de senhas

As senhas são o método de autenticação mais antigo em tecnologia da informação, ainda amplamente utilizado hoje. Infelizmente, é simplesmente impossível manter as senhas de todos os recursos da Internet na memória, desde que sejam todos diferentes e complexos! Aqui, os gerenciadores de senhas vêm em auxílio de uma pessoa, assumindo essa tarefa: uma pessoa se lembra de apenas uma senha mestra, que dá acesso a todo o resto.



Não gostei dos gerenciadores de senhas existentes: é inconveniente sincronizar o banco de dados de senhas entre diferentes dispositivos e sistemas operacionais; além disso, muitas vezes os programas gerenciadores são abertamente mal protegidos . Certa vez, estava lendo artigos sobre criptografia e me ocorreu um pensamento: por que não fazer um gerenciador de senhas que, em vez de armazenar senhas, as calcule?



A primeira maneira de implementar essa ideia que vem à mente são as funções de hash criptográficas. À primeira vista, tudo é legal: selecionamos uma função persistente (digamos, SHA-3 na versão de 224 bits), fornecemos a senha mestre qwerty e o tipo de conta vk como entrada , na saída obtemos instantaneamente 56 caracteres do conjunto 0123456789abcdef. Eu imediatamente encontrei dois projetos semelhantes: hackeado e potencialmente hackeado.... Há um grande problema com essa abordagem: as funções criptográficas de hash são projetadas, entre outras coisas, para serem tão rápidas e pouco exigentes quanto possível para os recursos e, portanto, é possível organizar um dicionário ou ataque de força bruta completo da senha mestre usando a senha interceptada para um site na CPU (relativamente lento), GPU , FPGA (muito mais rápido), ASIC (muito rápido). Para realizar tais ataques em algoritmos de hash populares sem usar sal, as tabelas de arco-íris também podem ser usadas, o que acelera muito o processo de hack na CPU.



Felizmente, existe outra opção de implementação - funções para obter chaves. Em suma, eles executam o hash, mas de forma relativamente lenta (digamos, um segundo em um processador regular) e com consumo de recursos relativamente grande (digamos, 16 megabytes de RAM) para tornar os ataques de força bruta e de força bruta o mais difícil possível. Entre as funções PBKDF2 modernas , bcrypt e scrypt familiares para mim , scrypt parecia melhor: criado levando em consideração a experiência dos dois primeiros, suportando computação em GPUs e microcircuitos (FPGA e ASIC) e projetado para flexibilidade na personalização para qualquer tarefa. Pensei na implementação deste projeto, mas por algum motivo coloquei-o em segundo plano. E em vão.



Criptógrafo Nadim Kobeissifez exatamente esse gerenciador de senhas npwd em JavaScript (funciona como um aplicativo de desktop através do Node.JS). Instalei o utilitário em um computador Linux e Windows, bem como em um laptop Linux, comecei a usá-lo em combate e gostei muito. Você insere a única senha mestra e o tipo de conta (por exemplo, "twitter") no aplicativo e, após alguns segundos, sua área de transferência já contém uma senha complexa calculada especificamente para esta conta, além disso, hackear sua senha mestra (leia: todas as suas senhas) por senha para uma conta será muito, muito difícil.



Mas também havia um problema. A versão do Windows realmente fornecia uma senha após alguns segundos, mas no Linux (inclusive no mesmo computador!) Demorava 15 segundos para os cálculos, o que era irritante. A princípio reduzi apenas uma constante, tornando a senha mestra menos segura, mas depois pensei - por que não reescrever o aplicativo em C, porque provavelmente funcionará muito mais rápido! Fui especialmente encorajado pelo pensamento de que tinha um plano para este projeto há muito tempo, mas era lento e alguém o implementou antes de mim.



Depois de alguns dias de trabalho tranquilo, criei meu próprio gerenciador de senhas cpwdtotalmente compatível com o original. Foi divertido! Depois de um pouco de otimização, consegui atingir a alta velocidade desejada. Não tentei portar o cpwd no Windows, mas deve ser fácil. Na página do projeto no GitHub, coletei uma coleção de links para projetos semelhantes no mundo acadêmico e além - descobri que a ideia é bem antiga.



Certamente não é uma bala de prata, mas funciona para mim. No processo de uso, me deparei com um problema: alguns sites têm requisitos interessantes para senhas, como "não mais de 20 caracteres", "deve haver uma letra grande, uma letra minúscula, um número e um caractere especial", como resultado, a senha gerada por npwd / cpwd às vezes requer trabalho manual antes de entrar ... Felizmente, não existem muitos desses sites.



O original foi publicado em meu blog em 7.08.15. 5 anos se passaram e ainda uso este utilitário.



All Articles