Quando um usuário em nosso site perde sua senha e sai para a página Senha perdida, precisamos fornecer uma nova senha temporária. Eu realmente não me importo com o quão aleatório isso seja, ou se ele corresponder a todas as regras de senha forte "necessárias", tudo o que eu quero fazer é fornecer a eles uma senha que eles possam alterar posteriormente.
O aplicativo é um aplicativo da Web escrito em C #. então eu estava pensando em ser mau e seguir o caminho mais fácil de usar parte de um Guid. ie
Guid.NewGuid().ToString("d").Substring(1,8)
Sugestões? pensamentos?
Respostas:
Sempre tem
System.Web.Security.Membership.GeneratePassword(int length, int numberOfNonAlphanumericCharacters
) .fonte
ASP.NET Core
?Isso tem um bom benefício de poder escolher em uma lista de caracteres disponíveis para a senha gerada (por exemplo, apenas dígitos, somente maiúsculas ou minúsculas etc.)
fonte
Random
não é criptograficamente seguro;System.Security.Cryptography.RNGCryptoServiceProvider
é uma escolha melhor.Os principais objetivos do meu código são:
A primeira propriedade é obtida assumindo um módulo de valor de 64 bits no tamanho do alfabeto. Para alfabetos pequenos (como os 62 caracteres da pergunta), isso leva a um viés desprezível. A segunda e a terceira propriedade são obtidas usando em
RNGCryptoServiceProvider
vez deSystem.Random
.(Esta é uma cópia da minha resposta para Como gerar seqüências alfanuméricas aleatórias de 8 caracteres em C #? )
fonte
(Você também pode fazer com que a classe onde esse método mora implemente IDisposable, mantenha uma referência
RNGCryptoServiceProvider
e descarte-a adequadamente, para evitar instanciações repetidas.)Observou-se que, como isso retorna uma string de base 64, o comprimento da saída é sempre um múltiplo de 4, com o espaço extra sendo usado
=
como caractere de preenchimento. Olength
parâmetro especifica o comprimento do buffer de bytes, não a sequência de saída (e, portanto, talvez não seja o melhor nome para esse parâmetro, agora penso nisso). Isso controla quantos bytes de entropia a senha terá. No entanto, como base-64 usa um bloco de 4 caracteres para codificar cada 3 bytes de entrada, se você solicitar um comprimento que não seja múltiplo de 3, haverá algum "espaço" extra, que será usado=
para preencher o extra.Se você não gostar de usar cadeias de base 64 por qualquer motivo, poderá substituir a
Convert.ToBase64String()
chamada por uma conversão para uma cadeia regular ou por qualquer um dosEncoding
métodos; por exemplo.Encoding.UTF8.GetString(tokenBuffer)
- apenas certifique-se de escolher um conjunto de caracteres que possa representar toda a gama de valores que sai do RNG e que produz caracteres compatíveis com onde quer que você esteja enviando ou armazenando isso. O uso do Unicode, por exemplo, tende a fornecer muitos caracteres chineses. O uso da base-64 garante um conjunto de caracteres amplamente compatível, e as características dessa string não devem torná-la menos segura, desde que você use um algoritmo de hash decente.fonte
Isso é muito maior, mas acho que parece um pouco mais abrangente: http://www.obviex.com/Samples/Password.aspx
fonte
Sei que esse é um tópico antigo, mas tenho o que pode ser uma solução bastante simples para alguém usar. Fácil de implementar, fácil de entender e fácil de validar.
Considere o seguinte requisito:
A seguinte expressão regular pode validar este caso:
Está fora do escopo desta pergunta - mas o regex é baseado em lookahead / lookbehind e lookaround .
O código a seguir criará um conjunto aleatório de caracteres que corresponde a esse requisito:
Para atender ao requisito acima, basta ligar para o seguinte:
O código começa com um caractere inválido (
"!"
) - para que a string tenha um comprimento no qual novos caracteres possam ser injetados.Em seguida, faz o loop de 1 até o número de caracteres em minúsculas necessário e, em cada iteração, pega um item aleatório da lista em minúsculas e o injeta em um local aleatório na string.
Em seguida, repete o loop para letras maiúsculas e para números.
Isso retorna as seqüências de comprimento =
lowercase + uppercase + numerics
em que caracteres minúsculos, maiúsculos e numéricos da contagem que você deseja foram colocados em uma ordem aleatória.fonte
System.Random
para itens críticos de segurança, como senhas. UseRNGCryptoServiceProvider
lowers[random.Next(lowers.Length - 1)].ToString()
Este código nunca irá gerar um 'z'. random.Next produz números inteiros menores que o número fornecido, portanto você não deve subtrair esse número extra do comprimento.Para esse tipo de senha, costumo usar um sistema que provavelmente gera senhas "usadas" mais facilmente. Curto, geralmente composto de fragmentos pronunciáveis e alguns números e sem ambiguidade entre caracteres (é 0 ou 0? A 1 ou I?). Algo como
(Digitado diretamente no navegador, use apenas como diretrizes. Além disso, adicione mais palavras).
fonte
Não gosto das senhas criadas por Membership.GeneratePassword (), pois são muito feias e têm muitos caracteres especiais.
Esse código gera uma senha não muito feia de 10 dígitos.
Claro, eu poderia usar um Regex para fazer todas as substituições, mas isso é mais IMO legível e sustentável.
fonte
Criei essa classe que usa RNGCryptoServiceProvider e é flexível. Exemplo:
fonte
Criei esse método semelhante ao disponível no provedor de associação. Isso é útil se você não quiser adicionar a referência da web em alguns aplicativos.
Isso funciona muito bem.
fonte
System.Random
para itens críticos de segurança, como senhas. UseRNGCryptoServiceProvider
Eu sempre fiquei muito feliz com o gerador de senhas embutido no KeePass. Como o KeePass é um programa .Net e código aberto, decidi pesquisar um pouco o código. Acabei referenciando o KeePass.exe, a cópia fornecida na instalação padrão do aplicativo, como referência no meu projeto e escrevendo o código abaixo. Você pode ver o quão flexível é graças ao KeePass. Você pode especificar o comprimento, quais caracteres incluir / não incluir, etc ...
fonte
fonte
Vou adicionar outra resposta mal aconselhada ao pote.
Eu tenho um caso de uso em que preciso de senhas aleatórias para comunicação máquina-máquina, portanto, não tenho nenhum requisito de legibilidade humana. Também não tenho acesso ao
Membership.GeneratePassword
meu projeto e não quero adicionar a dependência.Estou bastante certo de que
Membership.GeneratePassword
está fazendo algo semelhante a isso, mas aqui você pode ajustar os grupos de caracteres para desenhar.E algum exemplo de saída:
Para evitar queixas sobre o uso de
Random
: A principal fonte de aleatoriedade ainda é o RNG criptográfico. Mesmo se você pudesse deterministically preordenar a seqüência saindo deRandom
(dizem que só produziu1
), você ainda não sabe o próximo caractere que seria escolhido (embora isso iria limitar o leque de possibilidades).Uma extensão simples seria adicionar ponderação aos diferentes conjuntos de caracteres, o que poderia ser tão simples quanto aumentar o valor máximo e adicionar casos de queda para aumentar o peso.
Para um gerador de senhas aleatórias mais humanístico, uma vez implementei um sistema de prompt usando a lista de dados e palavras da EFF .
fonte
Eu gosto de olhar para gerar senhas, assim como gerar chaves de software. Você deve escolher entre uma variedade de caracteres que seguem uma boa prática. Pegue o que o Radu094 respondeu e modifique-o para seguir as boas práticas. Não coloque todas as letras na matriz de caracteres. Algumas letras são mais difíceis de dizer ou entender por telefone.
Você também deve considerar o uso de uma soma de verificação na senha que foi gerada para garantir que ela foi gerada por você. Uma boa maneira de conseguir isso é usar o algoritmo LUHN .
fonte
Aqui está o que eu montei rapidamente.
fonte
Eu uso esse código para gerar senha com composição de saldo de caracteres alfabéticos, caracteres numéricos e não_alfa_numéricos.
fonte
Isso é curto e funciona muito bem para mim.
fonte
No meu site, eu uso este método:
Edite a string
_SymbolsAll
para sua lista de matrizes.fonte
Adicionado algum código suplementar à resposta aceita. Ele melhora as respostas apenas usando o Random e permite algumas opções de senha. Também gostei de algumas das opções da resposta do KeePass, mas não quis incluir o executável na minha solução.
Esse foi o primeiro link quando procurei gerar senhas aleatórias e o seguinte não está no escopo da pergunta atual, mas pode ser importante considerar.
System.Web.Security.Membership.GeneratePassword
é criptograficamente seguro, com um mínimo de 20% dos caracteres não alfanuméricos.fonte
validChars pode ser qualquer construção, mas decidi selecionar com base nos intervalos de código ascii removendo os caracteres de controle. Neste exemplo, é uma cadeia de 12 caracteres.
fonte
fonte
Random
como estáticoEste pacote permite gerar uma senha aleatória enquanto indica fluentemente quais caracteres ela deve conter (se necessário):
https://github.com/prjseal/PasswordGenerator/
Exemplo:
fonte
Se você deseja usar a geração de números aleatórios criptograficamente segura usada pelo System.Web.Security.Membership.GeneratePassword, mas também deseja restringir o conjunto de caracteres a caracteres alfanuméricos, é possível filtrar o resultado com uma regex:
fonte
fonte
Insira um Timer: timer1, 2 botões: button1, button2, 1 textBox: textBox1 e um comboBox: comboBox1. Certifique-se de declarar:
Código fonte:
fonte
System.Random
por segurança.