À 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.
Respostas:
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
Depois de ler esta parte:
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.
fonte
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:
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!
fonte
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:
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:
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:
fonte
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?
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:
Ufa. Que post longo ...
Mas, para responder à sua pergunta original, @Shane:
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.
fonte
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.
fonte
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:
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.
fonte
Acho que a verdadeira pergunta que você deve fazer é: 'Como posso convencer as pessoas?'
fonte
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 é:
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).
fonte
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.
fonte
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)
fonte
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.
fonte
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.
fonte
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:
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:
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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?
fonte
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.
fonte
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:
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).
fonte
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:
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.
fonte
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".
fonte