Pergunta

Como posso converter o resultado hash, que é uma matriz de bytes, para uma string?

byte[] bytePassword = Encoding.UTF8.GetBytes(password);

using (MD5 md5 = MD5.Create())
{
    byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
} 

Eu preciso converter byteHashedPassword a uma corda.

Foi útil?

Solução

   public static string ToHex(this byte[] bytes, bool upperCase)
    {
        StringBuilder result = new StringBuilder(bytes.Length*2);

        for (int i = 0; i < bytes.Length; i++)
            result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));

        return result.ToString();
    }

Você pode então chamá-lo como um método de extensão:

string hexString = byteArray.ToHex(false);

Outras dicas

Eu sempre achei que este seja o mais conveniente:

string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");

Por alguma estranha razão BitConverter gosta de colocar traços entre bytes, de modo a substituir apenas remove-los.

Update: Se preferir hex "minúscula", basta fazer uma .ToLower () e boom.

Note que se você está fazendo isso como um laço apertado e muitos ops isso poderia ser caro desde há pelo menos dois elencos cordas implícitas e redimensiona acontecendo.

Você pode usar Convert.ToBase64String e Convert.FromBase64String para facilmente converter matrizes de bytes em strings.

Se você está na 'preferência Hex' acampamento você pode fazer isso. Esta é basicamente uma versão mínima da resposta por Philippe Leybaert.

string.Concat(hash.Select(x => x.ToString("X2")))

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

Bem, uma vez que é um hash, ele tem, possivelmente, valores que não podem ser mostrados em uma string normal, de modo a melhor aposta é a de convertê-lo para Base64 codificado string.

string s = Convert.ToBase64String(bytes);

e utilização

byte[] bytes = Convert.FromBase64(s);

para obter os bytes de volta.

Bem, você poderia usar o construtor de cadeia que leva bytes e uma codificação, mas você provavelmente vai ter um difícil de gerir corda fora do que uma vez que poderia contêm grande quantidade de personagens divertidos (bytes nulos, novas linhas, caracteres de controle, etc )

A melhor maneira de fazer isso seria para codificá-lo com base 64 para obter uma seqüência agradável que é fácil trabalhar com:

string s = Convert.ToBase64String(bytes);

E para ir de essa seqüência de volta para um array de bytes:

byte[] bytes = Convert.FromBase64String(s);

Para quem estiver interessado a Nuget empacotar eu criei chamado CryptoStringify lhe permite converter uma string para uma string hash usando uma sintaxe limpa agradável, sem ter que brincar com matrizes de bytes:

using (MD5 md5 = MD5.Create())
{
    string strHashedPassword = md5.Hash(password);
}

É um método de extensão em HashAlgorithm e KeyedHashAlgorithm tão obras sobre SHA1, HMACSHA1, SHA256 etc também.

https://www.nuget.org/packages/cryptostringify

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top