Pergunta

Pesquisei em todo o Google e não consigo encontrar um exemplo de código de uso do Scrypt (para hash de uma senha) usando o Criptosharp biblioteca.

Você pode fornecer um exemplo de hash da senha?

Foi útil?

Solução

É só uma única chamada então vou orientá-lo através dos parâmetros:

  1. key:esta é a sua senha, use a codificação UTF-8 (sem marca de ordem de bytes) para codificar sua senha em uma matriz de bytes;
  2. salt:uma sequência de bytes aleatórios seguros armazenados com o resultado da função scrypt, 16 bytes devem ser suficientes;
  3. cost:a sugestão dada é 262144, mas você pode querer aumentar esse valor se o seu servidor puder lidar com a carga adicional;
  4. blockSize:veja custo, a sugestão dada é 8;
  5. parallel:Eu manteria isso em 1, a menos que você queira experimentar multi-threading;
  6. maxThreads:em geral null vai servir bem;
  7. derivedKeyLength:bem, isso depende, pois as senhas 128 devem ser amplas, é improvável que sua senha tenha mais de 128 bits de segurança.

Você deve armazenar pelo menos o sal e o resultado.Você pode usar a codificação base 64 se quiser armazená-los como strings.

Eu recomendo que você armazene um dado adicional:uma versão do seu esquema de derivação de chave baseado em senha (PBKDF).Diga, configure-o para 1 para usar scrypt, usando a codificação de chave fornecida, tamanho do salt, custo, tamanho do bloco, etc.Nesse caso você pode atualizar seu esquema mais tarde (você precisa que o usuário forneça sua senha para fazer isso, então você terá que fazer isso online, então você acabará tendo vários esquemas operacionais ao mesmo tempo).

Observe que você pode encadear chamadas de função PBKDF, para poder usar a saída PBKDF original e usá-la como entrada para o próximo PBKDF.Nesse caso o usuário não precisa fornecer a senha (essa dica foi tirada do CodesInChaos em outra pergunta).

Outras dicas

@MaartebBodewes fornece uma excelente resposta com dicas adicionais muito sábias.Aqui está um exemplo de código com suas recomendações.Eu também sugeriria ler 'Sua senha é muito curta' o que mostra a importância do uso de criptografia moderna como (no momento em que este artigo foi escrito) BCrypt ou Criptografar.

public string Hash(string secret, string salt)
{
    var keyBytes = Encoding.UTF8.GetBytes(secret);
    var saltBytes = Encoding.UTF8.GetBytes(salt);
    var cost = 262144;
    var blockSize = 8;
    var parallel = 1;
    var maxThreads = (int?)null;
    var derivedKeyLength = 128;

    var bytes = SCrypt.ComputeDerivedKey(keyBytes, saltBytes, cost, blockSize, parallel, maxThreads, derivedKeyLength);
    return Convert.ToBase64String(bytes);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top