Como devo abordar eticamente o armazenamento de senha de usuário para recuperação posterior de texto sem formatação?

1344

À medida que continuo construindo mais e mais sites e aplicativos da Web, muitas vezes me pedem para armazenar as senhas do usuário de forma que elas possam ser recuperadas se / quando o usuário tiver um problema (para enviar um link de senha esquecido por e-mail, passe-o pelo telefone, etc.) Quando posso lutar contra essa prática e faço muita programação 'extra' para possibilitar redefinições de senha e assistência administrativa sem armazenar sua senha real.

Quando não posso combatê-lo (ou não posso vencer), sempre codifico a senha de alguma forma, para que, pelo menos, não seja armazenada como texto sem formatação no banco de dados - embora eu saiba que se meu banco de dados for invadido não levaria muito tempo para o culpado decifrar as senhas, o que me deixa desconfortável.

Em um mundo perfeito, as pessoas atualizam as senhas com freqüência e não as duplicam em muitos sites diferentes - infelizmente, conheço MUITAS pessoas que têm a mesma senha de trabalho / casa / email / banco e até mesmo me deram livremente quando precisam de assistência. Não quero ser o responsável por sua morte financeira se meus procedimentos de segurança de banco de dados falharem por algum motivo.

Moral e ética, sinto-me responsável por proteger o que pode ser, para alguns usuários, o seu sustento, mesmo que o tratem com muito menos respeito. Estou certo de que existem muitos caminhos a serem abordados e argumentos a serem feitos para salgar hashes e diferentes opções de codificação, mas há uma única 'melhor prática' quando você precisa armazená-las? Em quase todos os casos, estou usando PHP e MySQL, se isso faz alguma diferença na maneira como devo lidar com os detalhes.

Informações adicionais para Bounty

Quero esclarecer que sei que isso não é algo que você deseja fazer e que, na maioria dos casos, é melhor recusar. No entanto, não estou procurando uma palestra sobre os méritos de adotar essa abordagem. Estou procurando os melhores passos a serem seguidos se você adotar essa abordagem.

Em uma observação abaixo, enfatizei que os sites voltados principalmente para idosos, pessoas com problemas mentais ou muito jovens podem se tornar confusos para as pessoas quando solicitadas a executar uma rotina segura de recuperação de senha. Embora possamos achar simples e mundano nesses casos, alguns usuários precisam de assistência extra para que um técnico de serviço os ajude a entrar no sistema ou enviá-lo por e-mail / exibido diretamente para eles.

Nesses sistemas, a taxa de atrito desses dados demográficos pode prejudicar o aplicativo se os usuários não receberem esse nível de assistência de acesso; portanto, responda com essa configuração em mente.

Obrigado a todos

Esta tem sido uma pergunta divertida, com muito debate e eu gostei. No final, selecionei uma resposta que retém a segurança da senha (não precisarei manter texto simples ou senhas recuperáveis), mas também possibilita que a base de usuários especificada faça o login em um sistema sem as principais desvantagens encontradas. recuperação de senha normal.

Como sempre, havia cerca de 5 respostas que eu gostaria de ter marcado como corretas por diferentes razões, mas tive que escolher a melhor - todas as outras receberam um +1. Obrigado a todos!

Além disso, obrigado a todos na comunidade Stack que votaram nesta questão e / ou a marcaram como favorita. Aceito receber 100 votos como um elogio e espero que essa discussão tenha ajudado alguém com a mesma preocupação que eu.

Shane
fonte
155
Eu acho que ele sabe que não é bom. Ele ainda está procurando a melhor solução sob os requisitos estabelecidos.
21410 stfanw
33
No final do dia, tudo o que você fará será implementar cuidadosamente uma vulnerabilidade evitável.
rook
20
@ Michael Brooks - Quero que você saiba que estou absolutamente de acordo com o CWE-257 e gostaria de apenas citar esse texto literalmente toda vez que me pedem para tornar as senhas recuperáveis ​​como texto sem formatação. No entanto, na realidade, clientes e usuários raramente estão interessados ​​nos regulamentos do NIST e só querem que eu faça isso de qualquer maneira. Em 90% das vezes consigo convencê-los do contrário, mas nesses 10% em que não consigo, estou tentando determinar o melhor curso de ação - nesses casos, o CWE-257 é cinza na minha mão (infelizmente).
Shane
81
@AviD: O "baixo valor" do sistema não tem absolutamente nenhuma influência sobre esse problema, porque as pessoas reutilizam suas senhas . Por que as pessoas não conseguem entender esse fato simples? Se você quebrar as senhas em algum sistema de "baixo valor", provavelmente terá várias senhas válidas para outros sistemas de "alto valor".
Aaronaught
20
Outro ponto também foi encoberto, que acabei de mencionar no fluxo de comentários da minha resposta: Como você sabe que a pessoa que solicita esses requisitos é confiável? E se a desculpa de "usabilidade" for apenas uma fachada que oculta uma intenção real de roubar as senhas em algum momento no futuro? Sua ingenuidade pode ter custado milhões de clientes e acionistas. Quantas vezes os especialistas em segurança devem repetir isso antes de finalmente entrar: As ameaças de segurança mais comuns e mais graves são sempre INTERNAS.
Aaronaught

Respostas:

1037

Que tal adotar outra abordagem ou ângulo para esse problema? Pergunte por que a senha deve estar em texto sem formatação: se é para que o usuário possa recuperá-la, então, estritamente falando, você realmente não precisa recuperar a senha que definiu (eles não se lembram do que é). precisa ser capaz de fornecer a eles uma senha que eles possam usar .

Pense nisso: se o usuário precisar recuperar a senha, é porque a esqueceu. Nesse caso, uma nova senha é tão boa quanto a antiga. Porém, uma das desvantagens dos mecanismos comuns de redefinição de senha usados ​​hoje é que as senhas geradas produzidas em uma operação de redefinição são geralmente um monte de caracteres aleatórios; portanto, é difícil para o usuário digitar corretamente corretamente, a menos que copie-n- colar. Isso pode ser um problema para usuários de computador menos experientes.

Uma maneira de contornar esse problema é fornecer senhas geradas automaticamente com texto mais ou menos natural. Embora as seqüências de caracteres da linguagem natural possam não ter a entropia de uma sequência de caracteres aleatórios do mesmo tamanho, não há nada que diga que sua senha gerada automaticamente precisa ter apenas 8 (ou 10 ou 12) caracteres. Obtenha uma frase secreta gerada automaticamente de alta entropia juntando várias palavras aleatórias (deixe um espaço entre elas, para que elas ainda sejam reconhecíveis e digitáveis ​​por qualquer pessoa que possa ler). Seis palavras aleatórias de comprimento variável são provavelmente mais fáceis de digitar corretamente e com confiança do que 10 caracteres aleatórios, e elas também podem ter uma entropia mais alta. Por exemplo, a entropia de uma senha de 10 caracteres extraída aleatoriamente de maiúsculas, minúsculas, dígitos e 10 símbolos de pontuação (para um total de 72 símbolos válidos) teriam uma entropia de 61,7 bits. Usando um dicionário de 7776 palavras (como o Diceware usa) que pode ser selecionado aleatoriamente para uma senha de seis palavras, a senha terá uma entropia de 77,4 bits. Veja oPerguntas frequentes sobre o Diceware para mais informações.

  • uma senha com cerca de 77 bits de entropia: "admitir prosa flair table flair agudo"

  • uma senha com cerca de 74 bits de entropia: "K: & $ R ^ tt ~ qkD"

Sei que prefiro digitar a frase e, com copiar e colar, a frase não é menos fácil de usar do que a senha, portanto não há perda. Obviamente, se o seu site (ou qualquer que seja o ativo protegido) não precisar de 77 bits de entropia para uma senha gerada automaticamente, gere menos palavras (que eu tenho certeza que seus usuários gostariam).

Entendo os argumentos de que existem ativos protegidos por senha que realmente não têm um alto nível de valor; portanto, a violação de uma senha pode não ser o fim do mundo. Por exemplo, eu provavelmente não me importaria se 80% das senhas que eu uso em vários sites foram violadas: tudo o que poderia acontecer é alguém enviando um spam ou postando em meu nome por um tempo. Isso não seria ótimo, mas não é como se eles estivessem invadindo minha conta bancária. No entanto, considerando que muitas pessoas usam a mesma senha em seus sites de fórum na Web e em suas contas bancárias (e provavelmente bancos de dados de segurança nacional), acho que seria melhor manipular até mesmo as senhas de 'baixo valor' -recuperável.

Michael Burr
fonte
93
+1 para frases secretas, que atualmente parecem oferecer o melhor equilíbrio entre força da senha e recuperação do usuário.
Aaronaught
197
Você também pode fazer uma frase completa, por exemplo, <adjetivo> <substantivo> é <verbo> <adverb>. O gato verde está pulando descontroladamente. tem listas para as categorias. com 1024 opções para cada um, você tem 40 bits de entropia.
Dominik Weber
28
+1 para considerar reutilização de senha como uma questão crítica para evitá-la
lurscher
57
"Pense nisso - se o usuário precisar recuperar a senha, é porque a esqueceu" - não necessariamente verdade! Muitas vezes, quero obter minha senha porque estou no laptop e sei que minha máquina em casa tem minha senha armazenada ou está anotada em algum lugar seguro, e não quero violar isso ao receber uma nova senha. .
Joachim
5
A pergunta com maior pontuação no novo site do IT Security SE lida com a validade desse cálculo de entropia. (Bem, tecnicamente, ele lida com o xkcd que @Pieter ligada.)
Pops
592

Imagine que alguém encomendou um grande edifício a ser construído - um bar, digamos - e a seguinte conversa ocorre:

Arquiteto: Para um edifício desse tamanho e capacidade, você precisará de saídas de incêndio aqui, aqui e aqui.
Cliente: Não, isso é muito complicado e caro de manter, não quero portas laterais ou traseiras.
Arquiteto: Senhor, as saídas de incêndio não são opcionais, são necessárias conforme o código de incêndio da cidade.
Cliente: Não estou lhe pagando para discutir. Apenas faça o que eu pedi.

O arquiteto então pergunta como construir eticamente esse prédio sem saídas de incêndio?

Na indústria de construção e engenharia, é mais provável que a conversa termine assim:

Arquiteto: Este edifício não pode ser construído sem saídas de incêndio. Você pode ir a qualquer outro profissional licenciado e ele lhe dirá a mesma coisa. Eu estou saindo agora; me ligue de volta quando estiver pronto para cooperar.

A programação de computadores pode não ser uma profissão licenciada , mas muitas vezes as pessoas parecem se perguntar por que nossa profissão não recebe o mesmo respeito que um engenheiro civil ou mecânico - bem, não procure mais. Essas profissões, quando entregues requisitos de lixo (ou completamente perigosos), simplesmente recusam. Eles sabem que não é uma desculpa para dizer: "bem, eu fiz o meu melhor, mas ele insistiu, e eu tenho que fazer o que ele diz". Eles poderiam perder sua licença por essa desculpa.

Não sei se você ou seus clientes fazem parte de uma empresa de capital aberto, mas o armazenamento de senhas em qualquer forma recuperável pode causar falhas em vários tipos diferentes de auditorias de segurança. O problema não é o quão difícil seria para alguns "hackers" que tiveram acesso ao seu banco de dados recuperar as senhas. A grande maioria das ameaças à segurança é interna. O que você precisa proteger é contra um funcionário insatisfeito, sair com todas as senhas e vendê-las ao melhor lance. Usar criptografia assimétrica e armazenar a chave privada em um banco de dados separado não faz absolutamente nada para impedir esse cenário; sempre haverá alguém com acesso ao banco de dados privado, e isso é um sério risco de segurança.

Não existe uma maneira ética ou responsável de armazenar senhas de forma recuperável. Período.

Aaronaught
fonte
124
@Aaronaught - Eu acho que é um ponto justo e válido, mas deixe-me distorcer isso em você. Você está trabalhando em um projeto para uma empresa como funcionário e seu chefe diz 'este é um requisito do nosso sistema' (por qualquer motivo). Você sai do trabalho cheio de justa indignação? Sei que existe uma obrigação, quando estou no controle total, de ser responsável - mas se uma empresa optar por arriscar falhas de auditorias ou responsabilidades, é meu dever sacrificar meu trabalho para provar um argumento ou procuro o MELHOR e mais segura maneira de fazer o que eles dizem? Apenas jogando advogado do diabo ..
Shane
44
Não sou advogado, mas considere isso. Se o seu supervisor ordena que você faça algo contra os interesses da empresa, como expor a uma responsabilidade facilmente evitada, é seu trabalho obedecer ou recusar educadamente? Sim, eles são seu chefe, mas eles têm um chefe próprio, mesmo que sejam os investidores. Se você não passar por cima das cabeças deles, a cabeça de quem vai rolar quando sua brecha de segurança for explorada? Apenas algo a considerar.
Steven Sudit 18/02/10
68
Os desenvolvedores estão sempre tentando dizer como nossos trabalhos são muito mais difíceis do que outros, porque temos requisitos de lixo que mudam o tempo todo. Bem, este é um exemplo perfeito do porquê; nossa profissão precisa desesperadamente de uma espinha dorsal. Nossa profissão precisa desesperadamente dizer "não, isso não é um requisito aceitável, não é algo que eu possa desenvolver de boa fé, você pode ser meu cliente / empregador, mas tenho responsabilidades profissionais em relação a seus clientes e ao público, e se você quiser fazer isso, precisará procurar em outro lugar ".
Aaronaught
36
@sfussenegger: Você não precisa conhecer o passado. É inaceitável. Você está assumindo que o cliente é 100% confiável - e se ele estiver solicitando esse requisito especificamente para que possa decifrar as senhas mais tarde? A segurança é um dos poucos itens em desenvolvimento que são esculpidas em pedra. Existem algumas coisas que você simplesmente não faz e o armazenamento de senhas recuperáveis ​​é dez delas.
Aaronaught
37
OK, vamos fazer uma avaliação de risco, aqui e agora. "Se você armazenar senhas de forma recuperável, estará criando um risco não trivial de roubo de senhas. Também é provável que pelo menos alguns usuários usem as mesmas senhas para suas contas de email e banco. Se as senhas forem roubadas e as contas bancárias estão esgotadas, provavelmente será manchete, ninguém mais fará negócios com você novamente e você provavelmente será processado por não existir ". Podemos cortar a porcaria agora? O fato de você ter trazido a palavra "nazistas" para isso mostra claramente que você não tem senso de razão.
Aaronaught
206

Você pode criptografar a senha + um sal com uma chave pública. Para logins, verifique se o valor armazenado é igual ao valor calculado a partir da entrada do usuário + salt. Se chegar um momento, quando a senha precisar ser restaurada em texto sem formatação, você poderá descriptografar manualmente ou semi-automaticamente com a chave privada. A chave privada pode ser armazenada em outro local e adicionalmente pode ser criptografada simetricamente (o que exigirá uma interação humana para descriptografar a senha).

Eu acho que isso é realmente parecido com o modo como o Windows Recovery Agent funciona.

  • As senhas são armazenadas criptografadas
  • As pessoas podem fazer login sem descriptografar para texto sem formatação
  • As senhas podem ser recuperadas para texto sem formatação, mas apenas com uma chave privada, que pode ser armazenada fora do sistema (em um cofre do banco, se você desejar).
stefanw
fonte
34
As senhas -1 nunca devem ser "criptografadas" É uma violação do CWE-257 cwe.mitre.org/data/definitions/257.html
rook
100
1. A pergunta afirmou que a senha deve ser recuperada para texto sem formatação, portanto, este é um requisito. 2. Estou usando criptografia assimétrica aqui e não criptografia simétrica. A chave para descriptografar não é necessária para operações diárias e pode ser mantida em um banco seguro. A argumentação no link é válida, mas não se aplica a essa situação.
21810 stefanw
57
É verdade, mas você poderia concordar que, considerando os requisitos, essa é a maneira mais responsável de fazê-lo? Você pode me acertar o dia todo com o seu CWE-257, isso não mudará o problema interessante de armazenar e trabalhar com credenciais com segurança e poder recuperá-las para a forma original, se necessário.
stefanw
10
O Windows Recovery Agent também é um exemplo ruim aqui, pois lida com a criptografia real, não com o gerenciamento de senhas. Uma chave de criptografia não é igual a uma senha; as regras e práticas que cercam cada uma são completamente diferentes. Criptografia e autenticação não são iguais. A criptografia é para privacidade - uma chave é usada para proteger os dados . A autenticação é para identidade , onde a chave são os dados (é um fator no processo de autenticação). Então, repito, criptografia e autenticação não são as mesmas. Você não pode aplicar validamente os princípios de um para o outro.
Aaronaught
16
+1 Onde está o motivo de insistir obsessivamente no CWE-257? É uma fraqueza (CWE), não uma vulnerabilidade (CVE). Comparar senhas recuperáveis ​​com estouros de buffer é comparar maçãs e laranjas. Simplesmente verifique se o cliente entende o problema (deixe-o assinar algo que diz isso - caso contrário, ele pode não se lembrar de nada se estiver em questão) e siga em frente. Além disso, as medidas de segurança necessárias dependem do valor do sistema e do risco potencial de um ataque. Se um invasor bem-sucedido puder cancelar apenas algumas assinaturas de boletins, não há motivo para discutir sobre quaisquer problemas.
Sfussenegger
133

Não desista. A arma que você pode usar para convencer seus clientes é a não repudiabilidade. Se você pode reconstruir senhas de usuários por meio de qualquer mecanismo, você concedeu a seus clientes um mecanismo legal de não repúdio e eles podem repudiar qualquer transação que dependa dessa senha, porque não há como o fornecedor provar que não reconstruiu a senha. e colocar a transação por si mesmos. Se as senhas são armazenadas corretamente como resumos, e não como texto cifrado, isso é impossível; logo, o cliente final executou a transação ou violou seu dever de cuidado por meio da senha. Em ambos os casos, isso deixa a responsabilidade diretamente com ele. Já trabalhei em casos em que isso equivaleria a centenas de milhões de dólares. Não é algo que você queira errar.

Marquês de Lorne
fonte
2
Os logs do servidor da Web não contam em um tribunal? Ou, nesse caso, eles seriam considerados falsificados também?
Vinko Vrsalovic
10
@Vinko Vrsalovic, os logs do servidor da Web DEVEM contar no tribunal, para fazer isso, você precisa provar o não repúdio, a prova de autenticidade, a cadeia de evidências, etc., quais logs do servidor da web claramente não são.
Avid
7
Exatamente. O fornecedor deve provar que apenas o cliente poderia ter realizado essa transação. Um log do servidor da web não faz isso.
Marquês de Lorne
Nem todas as senhas são realmente necessárias para "transações", por assim dizer. Digamos que o site seja para desenvolver uma lista de favoritos de páginas da web. Nesse caso, o limite de responsabilidade (que geralmente é mencionado nos T&Cs ao se registrar no site) é zero, porque não há transação financeira. Se o site não tiver ações que afetem outras pessoas, no máximo, os dados serão perdidos para o usuário invadido. A empresa é protegida pelos T & C's.
Sablefoste
1
@Sablefoste Nesse site. Se o usuário usar a mesma senha em outro lugar, você estará criando o risco de vazar suas credenciais privadas. Se você nunca se envolver na prática, não poderá causar o problema.
Marquês de Lorne
94

Você não pode armazenar eticamente senhas para recuperação posterior de texto sem formatação. É simples assim. Mesmo Jon Skeet não pode armazenar eticamente senhas para recuperação posterior de texto sem formatação. Se seus usuários puderem recuperar senhas em texto sem formatação de uma forma ou de outra, também o potencial de um hacker que encontrar uma vulnerabilidade de segurança no seu código. E isso não é apenas a senha de um usuário que está sendo comprometida, mas todas elas.

Se seus clientes tiverem problemas com isso, diga a eles que o armazenamento de senhas recuperáveis ​​é ilegal. Aqui no Reino Unido, de qualquer forma, a Data Protection Act 1998 (em particular, Anexo 1, Parte II, Parágrafo 9) exige que os controladores de dados usem as medidas técnicas apropriadas para manter os dados pessoais seguros, levando em consideração, entre outras coisas, o danos que podem ser causados ​​se os dados forem comprometidos - o que pode ser considerável para usuários que compartilham senhas entre sites. Se eles ainda tiverem dificuldade em entender o fato de que é um problema, aponte-os para alguns exemplos do mundo real, como este .

A maneira mais simples de permitir que os usuários recuperem um logon é enviá-los por e-mail por um link único que os efetua login automaticamente e os leva diretamente para uma página na qual eles podem escolher uma nova senha. Crie um protótipo e mostre-o em ação a eles.

Aqui estão algumas postagens que escrevi sobre o assunto:

Atualização: agora estamos começando a ver ações e processos contra empresas que não conseguem proteger as senhas de seus usuários corretamente. Exemplo: o LinkedIn estuprou uma ação coletiva de US $ 5 milhões ; A Sony multou 250.000 libras por invasão de dados do PlayStation . Se bem me lembro, o LinkedIn estava realmente criptografando as senhas de seus usuários, mas a criptografia usada era muito fraca para ser eficaz.

jammycakes
fonte
8
@jimmycakes - Isso é uma coisa boa a se fazer em um sistema de baixa segurança, mas se você estiver armazenando dados de alto valor, deve assumir que o email da pessoa já está comprometido e que o envio de um link de login direto compromete o sistema. +1 por responder à minha pergunta com uma alternativa viável, mas apontar uma falha na lógica como um todo. Eu não quero que o Payppal envie um link de login direto SEMPRE. Pode parecer paranóico, mas sempre assumo que minha conta de email está corrompida - isso me mantém honesto. ;)
Shane
Absolutamente - eu esperaria que meu banco, no mínimo, me desse uma ligação telefônica e verifique minha identidade antes de me permitir redefinir ( não recuperar) minha senha. O que descrevi aqui é o padrão mínimo absoluto de segurança de senha que eu esperaria de qualquer site, em qualquer lugar.
jammycakes
1
Ignorando o banco ou paypal que não teria a restrição que você definiu; Se você presume que o email está comprometido, como é possível qualquer método online? Se você enviar uma senha gerada por e-mail, como isso é mais seguro?
quer
Não estou falando em obter a senha de um único indivíduo, mas em obter várias senhas de um banco de dados. Se um sistema armazena senhas recuperáveis ​​em texto sem formatação, um hacker pode potencialmente escrever um script para extrair todas as senhas do seu banco de dados.
Jammycakes # 13/10
Eu estou querendo saber sobre o envio de link / senha no e-mail, indo através da rede de forma simples através de nós de rede desconhecidos ...
Jakub
55

Depois de ler esta parte:

Em uma observação abaixo, enfatizei que os sites voltados principalmente para idosos, pessoas com problemas mentais ou muito jovens podem se tornar confusos para as pessoas quando solicitadas a executar uma rotina segura de recuperação de senha. Embora possamos achar simples e mundano nesses casos, alguns usuários precisam de assistência extra para que um técnico de serviço os ajude a entrar no sistema ou enviá-lo por e-mail / exibido diretamente para eles.

Nesses sistemas, a taxa de atrito desses dados demográficos pode prejudicar o aplicativo se os usuários não receberem esse nível de assistência de acesso; portanto, responda com essa configuração em mente.

Fiquei me perguntando se algum desses requisitos exige um sistema de senha recuperável. Por exemplo: tia Mabel liga e diz: "Seu programa de internet não está funcionando, não sei minha senha". "OK", diz o drone de atendimento ao cliente, "deixe-me verificar alguns detalhes e depois darei uma nova senha . Quando você fizer o próximo login, ele perguntará se você deseja manter essa senha ou alterá-la para algo que você possa se lembrar. mais facilmente."

Em seguida, o sistema é configurado para saber quando uma redefinição de senha ocorreu e exibe a mensagem "você gostaria de manter a nova senha ou escolher uma nova"?

Como isso é pior para os menos alfabetizados do que receber a senha antiga? E, embora a pessoa do serviço ao cliente possa fazer travessuras, o próprio banco de dados é muito mais seguro caso seja violado.

Comente o que há de ruim na minha sugestão e eu sugerirei uma solução que realmente faça o que você queria inicialmente.

Mr. Boy
fonte
4
@ john - Eu acho que é uma solução perfeitamente viável. Prepare-se para se inflamar com ameaças internas! Você sabe, se eu fizesse isso com uma redefinição de senha intermediária (a tecnologia define a senha manualmente como uma mesa temporária e diz a Mabel para digitar 1234 como sua senha), provavelmente funcionaria bem em um sistema que não contém dados importantes. Se fosse um ambiente de alta segurança, teremos um problema no qual o serviço de cust pode definir a senha do CEO para 1234 e efetuar login diretamente. Não existe uma solução perfeita, mas esta funciona em muitos casos. (+1)
Shane
5
Acabei de perceber essa resposta. @ Shane, não entendo por que você previu chamas sobre "ameaças internas". A capacidade de alterar uma senha não é uma fraqueza notável; o problema é a capacidade de descobrir uma senha que provavelmente será usada para outros serviços - seu e-mail, seu banco, seus sites de compras on-line que armazenam suas informações de CC. Essa fraqueza não se manifesta aqui; se Bob redefine a senha de Mabel e a informa por telefone, isso não lhe dá acesso a nenhuma outra conta dela. Eu, no entanto, forçaria em vez de "sugerir" uma redefinição de senha no login.
Aaronaught
@Aaronaught - Entendo seu ponto de vista, mas estou pensando em momentos em que até o pessoal do atendimento ao cliente fica trancado em determinadas áreas de um sistema (como folha de pagamento, contabilidade, etc.) e permite que eles definam uma senha diretamente é um problema de segurança por si só. No entanto, entendo que o tipo de sistema sobre o qual fiz essa pergunta difere amplamente de um sistema contábil interno. Provavelmente, poderíamos ter uma discussão totalmente diferente sobre sistemas internos proprietários e segurança de senha.
Shane
1
@ Shane: Então a pergunta faz ainda menos sentido. Presumi que você queria que alguém lesse uma senha por telefone. Se você quiser enviar por e-mail as senhas dos usuários por meio de algum sistema de autoatendimento automatizado, é possível dispensá-la totalmente, pois ela está sendo "protegida" com algo muito mais fraco. Talvez você precise ser muito mais específico sobre exatamente que tipo de cenários de usabilidade você está tentando oferecer suporte. Talvez essa análise mostre posteriormente que as senhas recuperáveis ​​nem são necessárias.
#
4
O código fornecido pela pessoa de suporte não precisa literalmente ser a nova senha. Pode ser apenas um código único que desbloqueia a função de redefinição de senha.
kgilpin
42

Michael Brooks tem sido bastante sincero sobre o CWE-257 - o fato de que, independentemente do método usado, você (o administrador) ainda pode recuperar a senha. Então, que tal essas opções:

  1. Criptografar a senha com a chave pública de outra pessoa - alguma autoridade externa. Dessa forma, você não pode reconstruí-lo pessoalmente, e o usuário terá que ir para essa autoridade externa e solicitar a recuperação da senha.
  2. Criptografe a senha usando uma chave gerada a partir de uma segunda senha. Faça essa criptografia do lado do cliente e nunca a transmita de forma clara para o servidor. Em seguida, para recuperar, faça a descriptografia do lado do cliente novamente, gerando novamente a chave a partir de suas entradas. É certo que essa abordagem está basicamente usando uma segunda senha, mas você sempre pode pedir para anotá-la ou usar a antiga abordagem de pergunta de segurança.

Eu acho que 1. é a melhor escolha, porque permite que você designe alguém da empresa do cliente para manter a chave privada. Certifique-se de que eles gerem a chave e guarde-a com instruções em um cofre, etc. Você pode até adicionar segurança escolhendo apenas criptografar e fornecer certos caracteres da senha para terceiros internos, para que eles precisem quebrar a senha para adivinhar isto. Fornecendo esses personagens para o usuário, eles provavelmente se lembrarão do que era!

Phil H
fonte
8
E, é claro, você pode usar qualquer técnica de divisão de segredo para exigir que alguém da sua empresa descriptografe. Mas nada que preencha os requisitos originais de ser capaz de enviar um usuário suas senhas ou ter algum de primeiro nível partidário telefone run-off-the-mill caminhar com eles através de registro no.
Christopher Creutzig
27

Houve muita discussão sobre questões de segurança para o usuário em resposta a essa pergunta, mas eu gostaria de adicionar uma menção de benefícios. Até agora, não vi nenhum benefício legítimo mencionado por ter uma senha recuperável armazenada no sistema. Considere isto:

  • O usuário se beneficia ao receber sua senha por email? Não. Eles recebem mais benefícios de um link de redefinição de senha de uso único, que, esperançosamente, permitiria que eles escolhessem uma senha da qual se lembrariam.
  • O usuário se beneficia de ter sua senha exibida na tela? Não, pelo mesmo motivo acima; eles devem escolher uma nova senha.
  • O usuário se beneficia de ter uma pessoa de suporte falando a senha para o usuário? Não; novamente, se a pessoa de suporte considerar que a solicitação do usuário para sua senha está devidamente autenticada, é mais benéfico para o usuário receber uma nova senha e a oportunidade de alterá-la. Além disso, o suporte por telefone é mais caro do que as redefinições de senha automatizadas, portanto a empresa também não se beneficia.

Parece que os únicos que podem se beneficiar de senhas recuperáveis ​​são aqueles com intenção maliciosa ou apoiadores de APIs ruins que exigem troca de senhas de terceiros (por favor, nunca use essas APIs!). Talvez você possa ganhar seu argumento afirmando sinceramente a seus clientes que a empresa não obtém benefícios e apenas passivos armazenando senhas recuperáveis .

Ao ler as entrelinhas desses tipos de solicitações, você verá que seus clientes provavelmente não entendem ou realmente se importam com o gerenciamento de senhas. O que eles realmente querem é um sistema de autenticação que não seja tão difícil para seus usuários. Portanto, além de dizer a eles como eles realmente não querem senhas recuperáveis, você deve oferecer maneiras de tornar o processo de autenticação menos doloroso, especialmente se você não precisar dos altos níveis de segurança de, digamos, um banco:

  • Permita que o usuário use o endereço de email para o nome de usuário. Já vi inúmeros casos em que o usuário esquece seu nome de usuário, mas poucos esquecem seu endereço de email.
  • Ofereça o OpenID e permita que terceiros paguem pelos custos do esquecimento do usuário.
  • Facilite as restrições de senha. Tenho certeza de que todos ficamos extremamente irritados quando algum site não permite sua senha preferida por causa de requisitos inúteis como "você não pode usar caracteres especiais" ou "sua senha é muito longa" ou "sua senha deve ser iniciada" com uma carta ". Além disso, se a facilidade de uso é uma preocupação maior do que a força da senha, você pode diminuir os requisitos não estúpidos, permitindo senhas mais curtas ou não exigindo uma mistura de classes de caracteres. Com restrições flexíveis, é mais provável que os usuários usem uma senha que não esquecerão.
  • Não expire senhas.
  • Permitir que o usuário reutilize uma senha antiga.
  • Permita que o usuário escolha sua própria pergunta de redefinição de senha.

No entanto, se você, por algum motivo (e por favor nos diga o motivo) , realmente, realmente, precisa ter uma senha recuperável, poderá impedir o usuário de comprometer potencialmente as outras contas online, fornecendo a ele uma senha não sistema de autenticação baseado. Como as pessoas já estão familiarizadas com os sistemas de nome de usuário / senha e são uma solução bem exercitada, esse seria o último recurso, mas certamente existem muitas alternativas criativas para senhas:

  • Deixe o usuário escolher um pino numérico, preferencialmente não com 4 dígitos, e preferencialmente apenas se as tentativas de força bruta estiverem protegidas.
  • Peça ao usuário que escolha uma pergunta com uma resposta curta, a qual somente eles sabem a resposta, nunca mudarão, sempre se lembrarão e não se importam que outras pessoas descubram.
  • Peça ao usuário que digite um nome de usuário e desenhe uma forma fácil de lembrar com permutações suficientes para se proteger contra adivinhações (veja esta foto bacana de como o G1 faz isso para desbloquear o telefone).
  • Para um site infantil, você pode gerar automaticamente uma criatura confusa com base no nome do usuário (como um identicon) e pedir ao usuário que dê à criatura um nome secreto. Eles podem ser solicitados a inserir o nome secreto da criatura para fazer login.
Jacob
fonte
Respondi aos comentários aqui, na minha resposta, uma vez que foi bastante demorado - acho importante rever a análise e a discussão das questões levantadas. stackoverflow.com/questions/2283937/…
AviD
O usuário se beneficia de ter sua senha exibida na tela? Na minha opinião - definitivamente sim! Toda vez que eu recebo uma senha obscura da Internet, agradeço à Apple que posso torná-la visível para não precisar digitá-la novamente 100 vezes. Eu posso imaginar como a pessoa com deficiência se sentiria.
Dmitri Zaitsev
1
Por que exibir uma senha obscura é melhor do que permitir que você escolha uma nova senha que possa se lembrar?
24513 Jacob
@ Jacob: Mais entropia?
Alexander Shcheblikin
25

De acordo com o comentário que fiz sobre a questão:
um ponto importante foi muito encoberto por quase todos ... Minha reação inicial foi muito semelhante à de Michael Brooks, até que percebi, como @stefanw, que a questão aqui é requisitos quebrados , mas estes são o que são.
Mas então, ocorreu-me que esse poderia nem ser o caso! O ponto que falta aqui é o valor tácito dos ativos do aplicativo. Em termos simples, para um sistema de baixo valor, um mecanismo de autenticação totalmente seguro, com todo o processo envolvido, seria um exagero, e o erro seria opção de segurança .
Obviamente, para um banco, as "melhores práticas" são uma obrigação e não há como violar eticamente o CWE-257. Mas é fácil pensar em sistemas de baixo valor em que simplesmente não vale a pena (mas uma senha simples ainda é necessária).

É importante lembrar que a verdadeira experiência em segurança consiste em encontrar trocas apropriadas, NÃO em divulgar dogmaticamente as "Melhores Práticas" que qualquer pessoa pode ler on-line.

Como tal, sugiro outra solução:
Dependendo do valor do sistema, e SOMENTE SE o sistema for de valor baixo e sem ativos "caros" (a própria identidade, incluída), E existem requisitos comerciais válidos que tornam o processo adequado impossível (ou suficientemente difícil / caro), E o cliente está ciente de todas as advertências ... Estou parando de dizer para não me incomodar com a criptografia, porque é muito simples / barato de implementar (mesmo considerando aceitável) gerenciamento de chaves) e fornece ALGUMA proteção (mais do que o custo de implementá-lo). Além disso, vale a pena analisar como fornecer ao usuário a senha original, seja por e-mail, exibindo na tela etc.
Então pode ser apropriado simplesmente permitir a criptografia reversível, sem a necessidade de interrupções especiais.

Como a suposição aqui é que o valor da senha roubada (mesmo agregada) é bastante baixo, qualquer uma dessas soluções pode ser válida.


Como há uma discussão animada, na verdade VÁRIAS discussões animadas, nas diferentes postagens e nos comentários separados, adicionarei alguns esclarecimentos e responderei a alguns dos pontos muito bons que foram levantados em outros lugares aqui.

Para começar, acho que está claro para todos aqui que permitir a recuperação da senha original do usuário é uma má prática e geralmente não é uma boa ideia. Isso não está de modo algum em disputa ...
Além disso, enfatizarei que em muitas situações, na MAIORIA, situações - é realmente errado, até sujo, desagradável e feio .

No entanto, o cerne da questão está em torno do princípio . Existe alguma situação em que talvez não seja necessário proibir isso e, em caso afirmativo, como fazê-lo da maneira mais correta e apropriada para a situação .

Agora, como @Thomas, @sfussenegger e poucos outros mencionados, a única maneira adequada de responder a essa pergunta, é fazer uma análise de risco completa de qualquer situação (ou hipotética), para entender o que está em jogo, quanto vale a pena proteger e quais outras atenuações estão em jogo para garantir essa proteção.
Não, NÃO é um chavão, é uma das ferramentas básicas e mais importantes para um profissional de segurança real. As melhores práticas são boas até certo ponto (geralmente como diretrizes para os inexperientes e os hacks), depois desse ponto uma análise cuidadosa de riscos assume o controle.

Sabe, é engraçado - eu sempre me considero um dos fanáticos por segurança e, de alguma forma, estou do lado oposto dos chamados "especialistas em segurança" ... Bem, a verdade é - porque sou fanático, e um especialista em segurança da vida real - não acredito em divulgar o dogma das "melhores práticas" (ou CWEs) SEM essa análise de risco importantíssima .
"Cuidado com o fanático por segurança que é rápido em aplicar tudo em seu cinto de ferramentas sem saber qual é o problema real contra o qual eles estão se defendendo. Mais segurança não significa necessariamente boa segurança".
A análise de risco e verdadeiros fanáticos por segurança apontariam para uma troca mais inteligente, baseada em valor / risco, com base em risco, perda potencial, possíveis ameaças, atenuações complementares etc. Qualquer "especialista em segurança" que não possa apontar para uma análise de risco sólida como o base para suas recomendações, ou suportam trocas lógicas, mas preferem expor dogmas e CWEs sem sequer entender como executar uma análise de risco, não são senão Security Hacks, e sua Especialização não vale o papel higiênico em que foram impressos.

De fato, é assim que obtemos o ridículo que é a segurança aeroportuária.

Mas antes de falarmos sobre as compensações apropriadas a serem feitas nesta situação, vamos dar uma olhada nos riscos aparentes (aparentes, porque não temos todas as informações básicas sobre essa situação, todos estamos com hipóteses - uma vez que a pergunta é qual hipotética situação pode haver ...)
Vamos assumir um sistema de BAIXO VALOR, mas não tão rival que seja o acesso público - o proprietário do sistema deseja impedir a representação casual, mas a segurança "alta" não é tão importante quanto a facilidade de uso. (Sim, é uma troca legítima ACEITAR o risco de que qualquer script-kiddie proficiente possa invadir o site ... Espere, o APT não está em voga agora ...?)
Por exemplo, digamos que estou organizando um site simples para uma grande reunião de família, permitindo que todos pensem sobre onde queremos ir no acampamento este ano. Estou menos preocupada com algum hacker anônimo, ou mesmo com o primo Fred, dando sugestões repetidas para voltar ao lago Wantanamanabikiliki, pois estou com a tia Erma que não consegue fazer logon quando precisa. Agora, tia Erma, sendo uma física nuclear, não é muito boa em lembrar senhas ou mesmo usando computadores ... Então, eu quero remover todo o atrito possível para ela. Mais uma vez, não estou preocupado com hacks, apenas não quero erros bobos de login errado - quero saber quem está chegando e o que eles querem.

De qualquer forma.
Então, quais são nossos principais riscos aqui, se criptografamos simetricamente senhas, em vez de usar um hash unidirecional?

  • Representando usuários? Não, eu já aceitei esse risco, não é interessante.
  • Administrador do mal? Bem, talvez ... Mas, novamente, eu não me importo se alguém pode se passar por outro usuário, INTERNO ou não ... e, de qualquer maneira, um administrador mal-intencionado receberá sua senha, não importa o quê - se o seu administrador estiver mal, seu jogo terminará de qualquer maneira.
  • Outra questão que foi levantada é que a identidade é realmente compartilhada entre vários sistemas. Ah! Esse é um risco muito interessante, que requer uma análise mais detalhada.
    Deixe-me começar afirmando que não é a identidade real compartilhada, mas a prova ou a credencial de autenticação. Tudo bem, uma vez que uma senha compartilhada me permitirá efetivamente entrar em outro sistema (por exemplo, minha conta bancária ou gmail), essa é efetivamente a mesma identidade, portanto, é apenas semântica ... Exceto que não é, . A identidade é gerenciada separadamente por cada sistema, nesse cenário (embora possa haver sistemas de identificação de terceiros, como o OAuth - ainda assim, separado da identidade nesse sistema - mais sobre isso posteriormente).
    Como tal, o ponto principal de risco aqui é que o usuário insere voluntariamente sua (mesma) senha em vários sistemas diferentes - e agora eu (o administrador) ou qualquer outro hacker do meu site terá acesso às senhas da tia Erma para o local dos mísseis nucleares.

Hummm.

Alguma coisa aqui parece ruim para você?

Deveria.

Vamos começar com o fato de que proteger o sistema de mísseis nucleares não é de minha responsabilidade , estou apenas construindo um local de passeio em família frakkin (para a MINHA família). Então, de quem é a responsabilidade? Umm ... E o sistema de mísseis nucleares? Duh.
Segundo, se eu quisesse roubar a senha de alguém (alguém conhecido por usar repetidamente a mesma senha entre sites seguros e não tão seguros) - por que me incomodaria em invadir seu site? Ou lutando com sua criptografia simétrica? Meu Deus, eu posso simplesmente criar meu próprio site simples , fazer com que os usuários se inscrevam para receber NOTÍCIAS MUITO IMPORTANTES sobre o que quiserem ... Puffo Presto, eu "roubei" suas senhas.

Sim, a educação do usuário sempre volta para nos morder no hienie, não é?
E não há nada que você possa fazer sobre isso ... Mesmo que você tivesse que fazer o hash das senhas deles no seu site e fazer tudo o que o TSA puder pensar, você adicionou proteção à senha deles, NÃO UM BRANCO , se eles continuarem colando promiscuamente suas senhas em todos os sites em que encontrarem. NÃO se incomode em tentar.

Em outras palavras, você não possui as senhas deles , então pare de tentar agir como você.

Então, meus queridos especialistas em segurança, como uma senhora idosa perguntava por Wendy's: "Onde está o risco?"

Mais alguns pontos, em resposta a algumas questões levantadas acima:

  • A CWE não é uma lei, ou regulamento, ou mesmo um padrão. É uma coleção de pontos fracos comuns , ou seja, o inverso das "Melhores Práticas".
  • A questão da identidade compartilhada é um problema real, mas incompreendido (ou deturpado) pelos opositores aqui. É uma questão de compartilhar a identidade por si só (!), NÃO de quebrar as senhas em sistemas de baixo valor. Se você estiver compartilhando uma senha entre um sistema de baixo e alto valor, o problema já está lá!
  • A propósito, o ponto anterior realmente apontaria CONTRA usando OAuth e similares para ambos os sistemas de baixo valor, e os sistemas bancários de alto valor.
  • Sei que foi apenas um exemplo, mas (infelizmente) os sistemas do FBI não são os mais seguros. Não é muito parecido com os servidores do blog do seu gato, mas também não ultrapassam alguns dos bancos mais seguros.
  • O conhecimento dividido, ou controle duplo, das chaves de criptografia NÃO acontece apenas nas forças armadas; na verdade, o PCI-DSS agora exige isso de basicamente todos os comerciantes, portanto, não está mais tão longe do mercado (se o valor o justificar).
  • Para todos aqueles que reclamam que perguntas como essas são o que faz a profissão de desenvolvedor parecer tão ruim: são respostas como essas que fazem a profissão de segurança parecer ainda pior. Novamente, é necessária a análise de risco focada nos negócios, caso contrário você se torna inútil. Além de estar errado.
  • Acho que é por isso que não é uma boa ideia apenas pegar um desenvolvedor regular e deixar mais responsabilidades de segurança nele, sem treinamento para pensar de forma diferente e procurar as vantagens e desvantagens corretas. Sem ofensas, para vocês aqui, sou a favor - mas há mais treinamento em ordem.

Ufa. Que post longo ...
Mas, para responder à sua pergunta original, @Shane:

  • Explique ao cliente a maneira correta de fazer as coisas.
  • Se ele ainda insistir, explique um pouco mais, insista, discuta. Jogue uma birra, se necessário.
  • Explique o risco de negócios para ele. Os detalhes são bons, os números são melhores, uma demonstração ao vivo geralmente é melhor.
  • SE ELE AINDA insiste, E apresenta razões comerciais válidas - é hora de você fazer uma chamada de julgamento:
    Este site é de baixo ou nenhum valor? É realmente um caso de negócios válido? É bom o suficiente para você? Não há outros riscos que você possa considerar que superariam os motivos comerciais válidos? (E, claro, o cliente NÃO é um site malicioso, mas é isso mesmo).
    Se assim for, apenas vá em frente. Não vale a pena o esforço, o atrito e a perda de uso (nessa situação hipotética) para implementar o processo necessário. Qualquer outra decisão (novamente, nessa situação) é uma troca ruim.

Portanto, o resultado final e uma resposta real - criptografem-no com um algoritmo simétrico simples, proteja a chave de criptografia com ACLs fortes e, de preferência, DPAPI ou similar, documente-a e faça com que o cliente (alguém com experiência suficiente para tomar essa decisão) assine isto.

Ávido
fonte
5
As senhas compartilhadas entre seu site de baixo valor com ativos "não" caros e o Facebook / GMail / seu banco são um ativo caro, mesmo em sites de baixo valor.
jammycakes
3
Penso que o problema aqui é que os grupos de usuários mencionados acima tendem a usar a mesma senha para todos os aplicativos de diversos níveis de segurança (de bancos a blogs de receita). Portanto, a questão é: se é de responsabilidade do desenvolvedor proteger os usuários mesmo deles mesmos. Eu definitivamente diria que sim!
22610
7
Sinto muito, mas a própria identidade é um ativo de alto valor, ponto final. Sem exceções, sem desculpas. Não importa quão pequeno e inconseqüente você pense que seu site é. E uma senha compartilhada é a identidade, se permitir que o hacker entre nas contas do Facebook, contas do Gmail, contas bancárias dos usuários, etc. Não tem nada a ver com semântica, mas tem tudo a ver com consequências. Basta perguntar a alguém que foi afetado por um ataque de hackers como este: theregister.co.uk/2009/08/24/4chan_pwns_christians #
jammycakes
2
@ Jacob, em que mundo seu cliente seria processado porque as contas da Erma em outros sistemas foram comprometidas? Mesmo com negligência grave por parte do seu cliente (o que NÃO é um dado, como elaborei), e ALÉM DO fato de que NÃO EXISTE MANEIRA de provar que o outro sistema foi violado por causa do seu, não existe uma posição legal possível. reivindicar qualquer forma de dano de um sistema no outro sistema. Seria expulso do tribunal com preconceito e desprezando o demandante. No entanto, Erma pode ser culpado por violar inúmeros Termos de serviço ...
Avid
5
@ Jacob, isso é muito errado. Só porque a senha é a mesma (o que violaria claramente os ToS e a política de segurança) deles, não há legitimidade legal para corroborar os dois. Isso é ALÉM do fato de que PROVAR seria quase impossível. Além disso, também apontarei que NENHUMA LEI exige que uma empresa aleatória não tenha práticas de segurança negligentes, a menos que regulamentos específicos sejam relevantes. Além disso, as senhas SÃO criptografadas (!), Portanto, a negligência está longe de ser uma conclusão perdida.
AviD 02/03/10
21

Que tal uma casa de recuperação?

Armazene as senhas com uma criptografia forte e não habilite as redefinições.

Em vez de redefinir senhas, permita o envio de uma senha descartável (que deve ser alterada assim que o primeiro logon ocorrer). Permita que o usuário mude para a senha que desejar (a anterior, se desejar).

Você pode "vender" isso como um mecanismo seguro para redefinir senhas.

Oded
fonte
Você sabe, eu usei isso em várias situações (geralmente esse é o meu meio termo), mas tive gente que me disse que o usuário final simplesmente não conseguiria a interação e que o suporte precisa ser capaz de 'dizer a eles seus senha "devido às circunstâncias do negócio". Eu concordo que, quando possível, isso é preferível.
Shane
Você sempre pode contar ao seu cliente sobre o risco de o banco de dados dele cair em mãos más e obter a publicidade de senhas roubadas ... Existem muitos exemplos por aí.
Oded
6
Peça a eles para assinarem o "design", com uma cláusula adicional de que eles não podem processar você se o que você os alertou realmente acontecer ... Pelo menos você se cobre.
Oded
4
As senhas -1 nunca devem ser "criptografadas" É uma violação do CWE-257 cwe.mitre.org/data/definitions/257.html
rook
34
@ Michael Brooks: Não há necessidade de votar e copiar e colar o mesmo comentário repetidamente; todos sabemos que é uma prática ruim. Shane afirmou que ele não tem influência no assunto e, portanto, as próximas melhores coisas estão sendo propostas.
Johannes Gorset
13

A única maneira de permitir que um usuário recupere sua senha original é criptografá-la com a própria chave pública do usuário. Somente esse usuário pode descriptografar sua senha.

Portanto, as etapas seriam:

  1. O usuário se registra em seu site (sobre SSL, é claro) sem ainda definir uma senha. Efetue login automaticamente ou forneça uma senha temporária.
  2. Você oferece armazenar sua chave PGP pública para recuperação futura de senha.
  3. Eles carregam sua chave PGP pública.
  4. Você pede que eles definam uma nova senha.
  5. Eles enviam suas senhas.
  6. Você faz o hash da senha usando o melhor algoritmo de hash de senha disponível (por exemplo, bcrypt). Use isso ao validar o próximo logon.
  7. Você criptografa a senha com a chave pública e armazena-a separadamente.

Se o usuário solicitar sua senha, você responderá com a senha criptografada (sem hash). Se o usuário não desejar recuperar sua senha no futuro (somente poderá redefini-la para uma gerada por serviço), as etapas 3 e 7 poderão ser ignoradas.

Nicholas Shanks
fonte
5
A maioria dos usuários não possui uma chave PGP (eu ainda não tenho uma; depois de 20 anos no setor, nunca senti a necessidade), e não é um processo sem atrito obter uma. Além disso, uma chave privada é realmente apenas um proxy para uma senha real de qualquer maneira. É uma senha para uma senha, em outras palavras; são tartarugas até o fim.
Robert Harvey
1
@RobertHarvey O objetivo é permitir que um usuário recupere sua senha sem permitir que os funcionários do site ou qualquer hacker o obtenham. Ao exigir que o processo de recuperação ocorra no próprio computador do usuário, você aplica isso. Pode muito bem haver alternativas ao PGP que possam alcançar o mesmo. Pode haver tartarugas por todo o caminho (talvez alguns elefantes ao longo do caminho), mas não vejo outra maneira. Para a população em geral (não propensos a ser alvo individual) ter suas senhas em um pedaço de papel, e ser incapaz de recuperá-los a partir do serviço, seria mais seguro do que estamos atualmente
Nicholas Shanks
Gosto disso porque força todos a ter uma chave pública PGP, o que é estranhamente algo muito ético a ser feito.
Lodewijk
você pode apenas gerar um e dar ao usuário.
my1
@RobertHarvey Você pode estar certo de que este "não é um processo sem atrito", mas pode ser um serviço extra para usuários avançados, que usuários comuns podem ignorá-lo. Quanto ao argumento sobre um PK ser "uma senha para uma senha", lembre-se de que, em teoria, pode ser assim para muitas senhas; você pode usar senhas diferentes para serviços diferentes e criptografá-las usando a mesma chave. Então o PK terá mais valor do que apenas uma única senha. Talvez seja de uma maneira abstrata comparável a um gerenciador de senhas (?). Não é imediatamente claro para mim que conseqüências isso pode ter embora ...
Kjartan
12

Acho que a verdadeira pergunta que você deve fazer é: 'Como posso convencer as pessoas?'

z-boss
fonte
4
@sneg - Bem, eu sou um cara muito convincente, mas às vezes é um chefe e às vezes um cliente, então nem sempre tenho o poder de que preciso para convencê-los de uma maneira ou de outra. Mas vou praticar no espelho um pouco mais ..;) #
Shane
Para ser convincente, você realmente não precisa de nenhuma outra alavanca além da sua competência e habilidade de comunicação. Se você conhece uma maneira melhor de fazer algo, mas as pessoas não ouvem ... Pense nisso.
z-boss
7
@ z-boss - Aparentemente você não trabalhou com / para algumas das cabeças duras com as quais tive o prazer de trabalhar. Às vezes, não importa se sua língua é banhada em ouro e você pode reprogramar o Google Chrome em um dia (o que, sem dúvida, pode realmente torná-lo útil), elas ainda não se mexem.
Shane
11

Eu tenho o mesmo problema. E da mesma forma, sempre acho que alguém hackea meu sistema, não é uma questão de "se", mas de "quando".

Portanto, quando preciso criar um site que precise armazenar informações confidenciais recuperáveis, como cartão de crédito ou senha, o que faço é:

  • criptografar com: openssl_encrypt (string $ data, string $ method, string $ password)
  • arg de dados :
    • as informações confidenciais (por exemplo, a senha do usuário)
    • serialize se necessário, por exemplo, se a informação for uma matriz de dados, como várias informações confidenciais
  • password arg : use uma informação que somente o usuário conheça:
    • a placa do usuário
    • número da Segurança Social
    • número de telefone do usuário
    • o nome mãe do usuário
    • uma sequência aleatória enviada por email e / ou sms no momento do registro
  • método arg :
    • escolha um método de cifra, como "aes-256-cbc"
  • NUNCA armazene as informações usadas no argumento "senha" no banco de dados (ou em qualquer outro local do sistema)

Quando necessário recuperar esses dados, use a função "openssl_decrypt ()" e peça a resposta ao usuário. Por exemplo: "Para receber sua senha, responda à pergunta: Qual é o seu número de celular?"

PS 1 : nunca use como senha os dados armazenados no banco de dados. Se você precisar armazenar o número do celular do usuário, nunca use essas informações para codificar os dados. Sempre use informações que apenas o usuário conhece ou que é difícil para alguém que não seja parente.

PS 2 : para informações de cartão de crédito, como "compra com um clique", o que faço é usar a senha de login. Essa senha é dividida em hash no banco de dados (sha1, md5, etc), mas no momento do login eu armazeno a senha em texto sem formatação na sessão ou em um cookie seguro não persistente (ou seja, na memória). Essa senha simples nunca fica no banco de dados; na verdade, sempre fica na memória, destruída no final da seção. Quando o usuário clica no botão "compra com um clique", o sistema usa essa senha. Se o usuário efetuou login com um serviço como facebook, twitter, etc., solicito a senha novamente no momento da compra (ok, não é um "clique" completo)) ou então utilizo alguns dados do serviço que o usuário usou para acessar (como o ID do Facebook).

Daniel Loureiro
fonte
9

Proteger credenciais não é uma operação binária: segura / não segura. A segurança tem tudo a ver com avaliação de riscos e é medida em um continuum. Os fanáticos por segurança odeiam pensar assim, mas a verdade feia é que nada é perfeitamente seguro. Senhas hash com requisitos rigorosos de senha, amostras de DNA e varreduras de retina são mais seguras, mas com um custo de desenvolvimento e experiência do usuário. As senhas de texto sem formatação são muito menos seguras, mas são mais baratas de implementar (mas devem ser evitadas). No final do dia, tudo se resume a uma análise de custo / benefício de uma violação. Você implementa a segurança com base no valor dos dados protegidos e no valor do tempo.

Qual é o custo da senha de alguém que está sendo divulgada? Qual é o custo da representação no sistema fornecido? Para os computadores do FBI, o custo pode ser enorme. Para o site único de cinco páginas de Bob, o custo pode ser insignificante. Um profissional oferece opções aos seus clientes e, quando se trata de segurança, apresenta as vantagens e os riscos de qualquer implementação. Isso é duplamente válido se o cliente solicitar algo que possa colocá-lo em risco devido à falha em atender aos padrões da indústria. Se um cliente solicitar especificamente criptografia bidirecional, garanto que você documente suas objeções, mas isso não deve impedir você de implementar da melhor maneira possível. No final do dia, é o dinheiro do cliente. Sim,

Se você estiver armazenando senhas com criptografia bidirecional, a segurança se resume ao gerenciamento de chaves. O Windows fornece mecanismos para restringir o acesso a chaves privadas de certificados em contas administrativas e com senhas. Se você estiver hospedando em outra plataforma, precisará ver quais opções você tem disponível. Como outros sugeriram, você pode usar criptografia assimétrica.

Não existe uma lei (nem a Lei de Proteção de Dados no Reino Unido) que saiba que afirma especificamente que as senhas devem ser armazenadas usando hashes unidirecionais. O único requisito em qualquer uma dessas leis é simplesmente que razoável medidas sejam tomadas para segurança. Se o acesso ao banco de dados for restrito, até as senhas de texto sem formatação podem se qualificar legalmente sob essa restrição.

No entanto, isso traz à luz mais um aspecto: precedência legal. Se a precedência legal sugerir que você deve usar hashes unidirecionais, considerando o setor em que seu sistema está sendo construído, isso será totalmente diferente. Essa é a munição que você usa para convencer seu cliente. Exceto que, a melhor sugestão para fornecer uma avaliação de risco razoável, documente suas objeções e implemente o sistema da maneira mais segura possível, conforme os requisitos do cliente.

Thomas
fonte
10
Sua resposta ignora completamente que as senhas são reutilizadas em vários sites / serviços, o que é essencial para este tópico e o motivo pelo qual as senhas recuperáveis ​​são consideradas uma fraqueza séria. Um profissional de segurança não delega decisões de segurança ao cliente não técnico; um profissional sabe que suas responsabilidades se estendem além do cliente pagador e não oferece opções com alto risco e recompensa zero . -1 por um discurso retórico sobre retórica e extremamente leve sobre fatos - e por nem mesmo responder à pergunta.
Aaronaught
4
Novamente, você está ignorando completamente a avaliação de riscos. Para usar seu argumento, você não pode parar com apenas hashes unidirecionais. Você também deve incluir requisitos de complexidade, tamanhos de senha, restrições de reutilização de senha e assim por diante. Argumentar que os usuários irão usar senhas idiotas ou reutilizá-las não é uma justificativa comercial suficiente se o sistema for irrelevante e, francamente, respondi à pergunta. A resposta curta: pressione para usar uma implementação std, documente suas objeções se você for anulado e siga em frente.
Thomas
7
E, novamente, você repete o princípio de que nada disso importa para um sistema de baixo valor! O valor da senha de um usuário não tem nada a ver com o valor da conta de um usuário no seu sistema. É um segredo , e um que você deve sempre manter. Eu gostaria de poder dar outro -1 para o comentário demonstrando que você ainda não entende os problemas aqui.
Aaronaught
5
A avaliação de riscos é a questão central. A reutilização de senha é apenas um problema em potencial em um conjunto muito maior de problemas. Por que não exigir fobs? Por que não exigir que a pessoa vá ao seu escritório para fazer login? Sem uma avaliação razoável dos riscos, não há como responder a essas perguntas. No seu mundo, tudo é um risco; portanto, todo sistema requer segurança de login no nível do FBI. Simplesmente não é assim que o mundo real funciona.
Thomas
7
A única coisa que fica clara aqui é que todo o seu argumento não passa de uma falácia do Slippery Slope e que você está tentando manipular os leitores com palavras-chave como "avaliação de risco" para encobrir esse fato. Tenha certeza de que qualquer sistema que o "FBI" use seja muito mais seguro que um hash de criptografia e um tamanho mínimo de senha. Se exigir sistemas de autenticação padrão do setor me torna um "fanático pela segurança", acho que sou um fanático; pessoalmente, me dói saber que existem pessoas por aí dispostas a sacrificar MINHA segurança por dinheiro. Isso é antiético .
Aaronaught
8

Torne a resposta para a pergunta de segurança do usuário uma parte da chave de criptografia e não armazene a resposta da pergunta de segurança como texto sem formatação (use o hash)

Rob Fonseca-Ensor
fonte
O usuário também pode responder de forma diferente à pergunta. Algumas perguntas sugerem respostas mais longas que são fáceis de reformular mais tarde.
Monoman
5
Perguntas de segurança são uma má ideia. Como sua mãe muda o nome de solteira depois que as informações são violadas? Veja também Segurança de engenharia de Peter Gutmann .
JWW
7

Eu implanto sistemas de autenticação de múltiplos fatores para viver, então, para mim, é natural pensar que você pode redefinir ou reconstruir a senha, enquanto usa temporariamente um fator a menos para autenticar o usuário apenas para o fluxo de trabalho de redefinição / recreação. Particularmente, o uso de OTPs (senhas de uso único) como alguns dos fatores adicionais reduz o risco se a janela de tempo for curta para o fluxo de trabalho sugerido. Implementamos geradores OTP de software para smartphones (que a maioria dos usuários já carrega consigo o dia todo) com grande sucesso. Antes que as reclamações de um plug comercial apareçam, o que estou dizendo é que podemos reduzir os riscos inerentes à manutenção de senhas facilmente recuperáveis ​​ou redefiníveis quando elas não são o único fator usado para autenticar um usuário.

Monoman
fonte
A remoção temporária de um fator de um sistema de autenticação de múltiplos fatores é realmente um meio muito mais seguro de redefinir uma senha do que os sistemas irritantes de "pergunta secreta" vistos em tantos sites. Mas, quanto ao armazenamento de senhas em um formato recuperável, não tenho certeza de como isso ajuda, a menos que você esteja usando o segundo fator para criptografar ou ofuscar o primeiro, e não tenho certeza de como isso é possível com algo como um SecurID. Você pode explicar?
Aaronaught 13/10/10
@Aaronaught O que eu disse é que, se você é obrigado a ter senhas recuperáveis, o risco inerente é menor se não for o único fator de autenticação e também é mais fácil para o usuário final, se esse fluxo de trabalho reutilizar fatores que ele / ela já possui e tem acesso atual a, do que tentar lembrar provavelmente também de 'respostas secretas' esquecidas ou usando links ou senhas temporárias com limite de tempo, ambos enviados por canais inseguros (a menos que você esteja usando S-MIME com certificados de cliente ou PGP, os custos de incorrer especialmente sobre gestão de associação correta e expiração / substituição)
Monoman
1
Suponho que tudo isso seja verdade, mas para começar, o risco de comprometimento público é mínimo; o problema mais sério com senhas recuperáveis ​​é a segurança interna e, potencialmente, permite que um funcionário insatisfeito saia com as senhas de email de milhares de clientes, ou um CEO corrupto para vendê-lo a phishers e spammers. A autenticação de dois fatores é excelente para combater o roubo de identidade e a adivinhação de senha, mas não traz muita coisa para a tabela, na medida em que mantém o banco de dados de senhas real seguro.
Aaronaught 18/10/10
5

Desculpe, mas desde que você tenha uma maneira de decodificar a senha deles, não há como garantir a segurança. Lute com amargura e, se você perder, CYA.

Steven Sudit
fonte
5

Só me deparei com essa discussão interessante e calorosa. O que mais me surpreendeu foi o quão pouca atenção foi dada à seguinte pergunta básica:

  • Q1 Quais são os motivos reais pelos quais o usuário insiste em ter acesso à senha armazenada em texto sem formatação? Por que tem tanto valor?

As informações de que os usuários são mais velhos ou mais jovens realmente não respondem a essa pergunta. Mas como uma decisão comercial pode ser tomada sem o entendimento adequado da preocupação do cliente?

Agora, por que isso importa? Porque se a causa real da solicitação dos clientes for o sistema dolorosamente difícil de usar, talvez resolver a causa exata resolva o problema real?

Como não tenho essas informações e não posso falar com esses clientes, só posso adivinhar: trata-se de usabilidade, veja acima.

Outra pergunta que eu vi perguntou:

  • Q2 Se o usuário não se lembra da senha em primeiro lugar, por que a senha antiga importa?

E aqui está a resposta possível. Se você tem um gato chamado "miaumiau" e usou o nome dela como senha, mas esqueceu que o fez, preferiria ser lembrado do que era ou melhor, receber algo como "# zy * RW (ew")

Outro motivo possível é que o usuário considera um trabalho difícil criar uma nova senha! Portanto, enviar a senha antiga de volta dá a ilusão de salvá-la daquele trabalho doloroso novamente.

Eu só estou tentando entender o motivo. Mas, seja qual for o motivo, é o motivo e não a causa que deve ser abordada.

Como usuário, quero coisas simples! Eu não quero trabalhar duro!

Se eu entrar em um site de notícias para ler jornais, quero digitar 1111 como senha e passar !!!

Eu sei que é inseguro, mas com o que eu me importo de alguém ter acesso à minha "conta"? Sim, ele também pode ler as notícias!

O site armazena minhas informações "particulares"? As notícias que li hoje? Então é problema do site, não meu! O site mostra informações privadas para o usuário autenticado? Então não mostre em primeiro lugar!

Isso é apenas para demonstrar a atitude do usuário em relação ao problema.

Então, para resumir, não acho que seja um problema de como "armazenar com segurança" senhas de texto simples (que sabemos que é impossível), mas como abordar a preocupação real dos clientes.

Dmitri Zaitsev
fonte
4

Como lidar com senhas perdidas / esquecidas:

Ninguém jamais poderá recuperar senhas.

Se os usuários esquecerem suas senhas, eles devem pelo menos saber seus nomes de usuário ou endereços de email. Mediante solicitação, gere um GUID na tabela Usuários e envie um email contendo um link contendo o guia como parâmetro para o endereço de email do usuário.

A página por trás do link verifica se o parâmetro guid realmente existe (provavelmente com alguma lógica de tempo limite) e solicita ao usuário uma nova senha.

Se você precisar que os usuários de ajuda da linha direta, adicione algumas funções ao seu modelo de doações e permita que a função da linha direta efetue login temporariamente como usuário identificado. Registre todos esses logins da linha direta. Por exemplo, o Bugzilla oferece esse recurso de representação aos administradores.

devio
fonte
GUID é uma péssima idéia, não é suficientemente aleatória e fácil de usar. existem outros problemas com isso, consulte stackoverflow.com/questions/664673/…
AviD
3

E quanto a enviar a senha em texto sem formatação após o registro, antes de criptografá-la e perdê-la? Eu já vi muitos sites fazendo isso, e obter essa senha do email do usuário é mais segura do que deixá-la no seu servidor / comp.

casraf
fonte
Eu não assumiria que o email é mais seguro do que qualquer outro sistema. Embora isso tire a preocupação legal das minhas mãos, ainda existe a questão de alguém perder / excluir seu email e agora estou de volta à estaca zero.
Shane
Forneça uma redefinição de senha e envie por e-mail a senha em texto sem formatação. Eu acho que é o máximo que você pode fazer sobre o assunto, sem manter uma cópia da senha.
casraf 25/02/10
Esta é uma ideia absolutamente horrível. É ineficaz (muitos usuários realmente excluem e-mails após a leitura) e pior do que você está tentando se proteger (já que o e-mail não é criptografado por padrão e passa por redes não confiáveis). Melhor sugerir ao usuário que ele anote a senha, pelo menos enviando um e-mail a si mesmo, as informações nunca vão além do servidor de e-mail, e não em toda a Internet!
Ben Voigt
3

Se você não pode simplesmente rejeitar o requisito de armazenar senhas recuperáveis, que tal isso como seu contra-argumento?

Podemos criar hash de senhas corretamente e criar um mecanismo de redefinição para os usuários ou remover todas as informações de identificação pessoal do sistema. Você pode usar um endereço de e-mail para configurar as preferências do usuário, mas é isso. Use um cookie para obter preferências automaticamente em futuras visitas e jogar os dados fora após um período razoável.

A única opção que geralmente é ignorada na política de senha é se uma senha é realmente necessária. Se a única coisa que sua política de senha faz é causar chamadas de atendimento ao cliente, talvez você possa se livrar dela.

anopres
fonte
Desde que você tenha um endereço de email associado a uma senha e essa senha seja recuperável, você potencialmente vazou a senha para esse endereço de email devido à reutilização da senha. Essa é realmente a principal preocupação aqui. Não há realmente nenhuma outra informação pessoal identificável que importe.
Aaronaught 13/10/10
1
Você perdeu completamente o meu ponto. Se você realmente não precisa de uma senha, não colete uma. Os desenvolvedores geralmente ficam presos no modo de pensar "é assim que fazemos". Às vezes, ajuda a eliminar noções pré-concebidas.
Anopres 14/10/10
2

Os usuários realmente precisam recuperar (por exemplo, ser avisados) qual a senha que eles esqueceram ou simplesmente precisam acessar o sistema? Se o que eles realmente querem é uma senha para fazer logon, por que não ter uma rotina que simplesmente altere a senha antiga (seja ela qual for) para uma nova senha que a pessoa de suporte possa dar à pessoa que perdeu sua senha?

Eu trabalhei com sistemas que fazem exatamente isso. A pessoa de suporte não tem como saber qual é a senha atual, mas pode redefini-la para um novo valor. É claro que todas essas redefinições devem ser registradas em algum lugar e uma boa prática seria gerar um email para o usuário informando que a senha foi redefinida.

Outra possibilidade é ter duas senhas simultâneas que permitam o acesso a uma conta. Uma é a senha "normal" que o usuário gerencia e a outra é como uma chave principal / esqueleto conhecida apenas pela equipe de suporte e é a mesma para todos os usuários. Dessa forma, quando um usuário tem um problema, a pessoa de suporte pode fazer login na conta com a chave mestra e ajudar o usuário a alterar sua senha para qualquer que seja. Desnecessário dizer que todos os logins com a chave mestra também devem ser registrados pelo sistema. Como medida extra, sempre que a chave mestra é usada, você também pode validar as credenciais das pessoas de suporte.

-EDIT- Em resposta aos comentários sobre não ter uma chave mestra: concordo que é ruim, assim como acredito que é ruim permitir que qualquer pessoa que não seja o usuário tenha acesso à conta do usuário. Se você olhar para a pergunta, toda a premissa é que o cliente exigia um ambiente de segurança altamente comprometido.

Uma chave mestra não precisa ser tão ruim quanto parece à primeira vista. Eu trabalhava em uma fábrica de defesa onde eles percebiam a necessidade do operador de computador mainframe ter "acesso especial" em certas ocasiões. Eles simplesmente colocam a senha especial em um envelope lacrado e a colam na mesa do operador. Para usar a senha (que o operador não sabia), ele teve que abrir o envelope. A cada mudança de turno, uma das tarefas do supervisor de turno era verificar se o envelope havia sido aberto e se a senha foi alterada imediatamente (por outro departamento) e se a nova senha foi colocada em um novo envelope e o processo iniciou tudo. mais uma vez. O operador seria questionado sobre o motivo de sua abertura e o incidente seria documentado para o registro.

Embora esse não seja um procedimento que eu projetaria, ele funcionou e proporcionou uma excelente prestação de contas. Tudo foi registrado e revisado, além de todos os operadores terem autorizações secretas do Departamento de Defesa e nunca tivemos nenhum abuso.

Por causa da revisão e supervisão, todos os operadores sabiam que, se usassem mal o privilégio de abrir o envelope, estavam sujeitos a demissão imediata e possível processo criminal.

Então, acho que a resposta real é que, se alguém quer fazer as coisas da maneira certa, contrata pessoas em quem pode confiar, faz verificações de antecedentes e exerce supervisão e prestação de contas da gerência.

Mas, novamente, se o cliente desse pobre sujeito tivesse um bom gerenciamento, eles não teriam pedido uma solução tão comprometida com a segurança em primeiro lugar, agora pediriam?

JonnyBoats
fonte
Uma chave mestra seria muito arriscada, a equipe de suporte teria acesso a todas as contas - e depois que você entregar essa chave a um usuário, ele terá a chave mestra e acesso a tudo.
Carson Myers
Uma chave mestra é uma péssima idéia, pois se alguém a descobre (ou a divulga por acidente), ela pode explorá-la. Como o mecanismo de redefinição de senha por conta é preferível.
Phil Miller
Estou curioso, pensei que o Linux por padrão tinha uma conta de superusuário com acesso no nível da raiz? Isso não é uma "chave mestra" para acessar todos os arquivos no sistema?
precisa saber é o seguinte
@JonnyBoats Sim, é. É por isso que Unixes modernos como o Mac OS X desabilitam a conta raiz.
Nicholas Shanks
@NicholasShanks: Desativar a conta root ou desabilitar o logon interativo na conta root? Ainda há muito código em execução com permissões ilimitadas.
Ben Voigt
2

Pelo pouco que entendi sobre esse assunto, acredito que, se você estiver criando um site com uma senha / login, não deverá nem mesmo ver a senha de texto sem formatação no servidor. A senha deve ser hash e provavelmente salgada antes mesmo de sair do cliente.

Se você nunca vir a senha de texto sem formatação, a questão da recuperação não surgirá.

Além disso, deduzo (da Web) que (supostamente) alguns algoritmos como o MD5 não são mais considerados seguros. Não tenho como julgar isso sozinho, mas é algo a considerar.

Jeremy C
fonte
1

abra um banco de dados em um servidor autônomo e forneça uma conexão remota criptografada para cada servidor da web que requer esse recurso.
não precisa ser um banco de dados relacional, pode ser um sistema de arquivos com acesso ao FTP, usando pastas e arquivos em vez de tabelas e linhas.
conceda aos servidores da Web permissões somente de gravação, se puder.

Armazene a criptografia não recuperável da senha no banco de dados do site (vamos chamá-lo de "passe-a") como as pessoas normais fazem :)
em cada novo usuário (ou alteração de senha) armazene uma cópia simples da senha no banco de dados remoto. use a identificação do servidor, a identificação do usuário e "pass-a" como uma chave composta para essa senha. você pode até usar uma criptografia bidirecional na senha para dormir melhor à noite.

agora, para que alguém obtenha a senha e seu contexto (ID do site + ID do usuário + "pass-a"), ele deve:

  1. hackear o banco de dados do site para obter um par ("pass-a", ID do usuário).
  2. obter o ID do site de algum arquivo de configuração
  3. encontre e invadir o banco de dados de senhas remotas.

você pode controlar a acessibilidade do serviço de recuperação de senhas (expô-lo apenas como um serviço da Web seguro, permitir apenas uma certa quantidade de recuperações de senhas por dia, fazê-lo manualmente etc.) e até cobrar um valor extra por esse "acordo de segurança especial".
O servidor de banco de dados de recuperação de senhas está bastante oculto, pois não possui muitas funções e pode ser melhor protegido (você pode personalizar permissões, processos e serviços).

Em suma, você torna o trabalho mais difícil para o hacker. a chance de uma violação de segurança em um único servidor ainda é a mesma, mas será difícil reunir dados significativos (uma correspondência de conta e senha).

Amir Arad
fonte
3
Se o servidor de aplicativos puder acessá-lo, qualquer pessoa com acesso ao servidor de aplicativos (seja um hacker ou um invasor malicioso). Isso oferece zero segurança adicional.
molf
1
A segurança adicional aqui é que o banco de dados do servidor de aplicativos não contém senhas (portanto, é necessário um segundo hack - para o banco de senhas), e o banco de senhas pode ser melhor protegido contra atividades irregulares, pois você controla a acessibilidade do serviço de recuperação de senhas. para que você possa detectar recuperações de dados em massa, alterar a chave SSH de recuperação semanalmente ou até não permitir a recuperação automática de passes e fazer tudo manualmente. Essa solução também se encaixa em qualquer outro esquema de criptografia interno (como as chaves pública + privada, salt etc.) para o banco de dados de senhas.
Amir Arad
1

Outra opção que você pode não ter considerado é permitir ações por email. É um pouco complicado, mas eu implementei isso para um cliente que precisava que os usuários "fora" de seu sistema exibissem (somente leitura) determinadas partes do sistema. Por exemplo:

  1. Depois que um usuário é registrado, ele tem acesso total (como um site comum). O registro deve incluir um email.
  2. Se forem necessários dados ou uma ação e o usuário não se lembrar da senha, ele ainda poderá executar a ação clicando em um botão especial " envie-me um e-mail para permissão ", ao lado do botão " enviar " normal .
  3. A solicitação é então enviada para o email com um hiperlink perguntando se eles desejam que a ação seja executada. É semelhante a um link de e-mail de redefinição de senha, mas, em vez de redefinir a senha, ele executa a ação única .
  4. O usuário clica em "Sim" e confirma que os dados devem ser mostrados ou que a ação deve ser executada, dados revelados etc.

Como você mencionou nos comentários, isso não funcionará se o email for comprometido, mas aborda o comentário de @joachim sobre não querer redefinir a senha. Eventualmente, eles precisariam usar a redefinição de senha, mas poderiam fazer isso em um momento mais conveniente, ou com a ajuda de um administrador ou amigo, conforme necessário.

Uma reviravolta nessa solução seria enviar a solicitação de ação a um administrador confiável de terceiros. Isso funcionaria melhor em casos com usuários idosos, com problemas mentais, muito jovens ou usuários confusos. Obviamente, isso requer um administrador confiável para essas pessoas apoiarem suas ações.

Sablefoste
fonte
1

Sal e hash a senha do usuário normalmente. Ao fazer login no usuário, permita a senha do usuário (após salga / hash), mas também permita que o que o usuário digitou literalmente também corresponda.

Isso permite que o usuário digite sua senha secreta, mas também permite que ele digite a versão salgada / com hash de sua senha, que é o que alguém leria no banco de dados.

Basicamente, faça com que a senha salgada / com hash também seja uma senha de "texto simples".

Eliott
fonte
Por que você acha necessário comparar o que o usuário digitou diretamente com a senha hash armazenada no banco de dados? Que tipo de funcionalidade isso oferece? Além disso, ao fazer isso, é extremamente importante aplicar a função de comparação em tempo constante entre a senha inserida pelo usuário e a senha com hash do banco de dados. Caso contrário, é quase trivialmente possível determinar a senha com hash com base nas diferenças de tempo.
ArtJom B. #
1
@ArtjomB. A pergunta pergunta como proteger a senha do usuário e, ao mesmo tempo, permitir que o suporte ao cliente (CS) fale / envie um email ao usuário digitando sua senha esquecida. Ao tornar a versão em hash utilizável como uma senha em texto sem formatação, o CS pode lê-la e fazer com que o usuário a substitua por uma senha esquecida. O CS também pode usá-lo para efetuar login como usuário e ajudá-lo em uma tarefa. Isso também permite que os usuários que se sentem confortáveis ​​com os sistemas automatizados de senha esquecida sejam protegidos, pois a senha que eles inserem e usam é hash.
Eliott
Eu vejo. Eu não li a pergunta na íntegra. O uso de uma comparação em tempo constante ainda é necessário para evitar quebras triviais de todo o sistema.
11137 Artjom B.