Tronquer un tableau d'octets par rapport à la chaîne encodée substringing sortant de SHA-256

StackOverflow https://stackoverflow.com/questions/4494402

  •  12-10-2019
  •  | 
  •  

Question

Je ne suis pas familier avec des algorithmes de hachage et les risques associés lors de leur utilisation et ont donc une question sur la réponse ci-dessous que j'ai reçu sur une question précédente. . .

  

D'après le commentaire que le moût de valeur de hachage, lorsque codé en ASCII, correspondent à moins de 16 caractères ASCI, la solution est d'abord, choisir une fonction de hachage cryptographique (la famille SHA-2 comprend SHA-256, SHA-384, et SHA-512)   puis, pour tronquer la sortie de la fonction de hachage choisi de 96 bits (12 octets) - qui est, de garder les 12 premiers octets de la sortie de la fonction de hachage et jeter les octets restants   puis, à base 64 coder la sortie tronqué à 16 caractères ASCII (128 bits)   qui donne effectivement une forte 96 bits hachage cryptographique.

Si je sous-chaîne de la chaîne codée de base 64 à 16 caractères est que fondamentalement différent maintenir ensuite les 12 premiers octets de la fonction de hachage et ensuite les bases 64 codant pour? Si oui, quelqu'un pourrait-il expliquer s'il vous plaît (fournir un exemple de code) pour tronquer le tableau d'octets?

J'ai testé la sous-chaîne de la pleine valeur de hachage contre 36,000+ valeurs distinctes et a eu aucune collision. Le code ci-dessous est mon implémentation actuelle.

Merci pour toute aide (et de clarté), vous pouvez fournir.

public static byte[] CreateSha256Hash(string data)
{
    byte[] dataToHash = (new UnicodeEncoding()).GetBytes(data);
    SHA256 shaM = new SHA256Managed();
    byte[] hashedData = shaM.ComputeHash(dataToHash);

    return hashedData;
}

public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row)
{
    byte[] hashedData = CreateSha256Hash(Row.HashString);

    string s = Convert.ToBase64String(hashedData, Base64FormattingOptions.None);

    Row.HashValue = s.Substring(0, 16);


}

[Original post] (Http://stackoverflow.com/questions/4340471/is-there-a-hash-algorithm-that-produces-a-hash-size-of-64-bits-in-c)

Était-ce utile?

La solution

Non, il n'y a pas de différence. Cependant, il est plus facile d'obtenir que la chaîne base64 des 12 premiers octets du tableau, au lieu de tronquer le tableau:

public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row) {

    byte[] hashedData = CreateSha256Hash(Row.HashString);

    Row.HashValue = Convert.ToBase64String(hashedData, 0, 12);

}

La base 64 codant met simplement 6 bits dans chaque caractère, de sorte que 3 octets (24 bits) passe en 4 caractères. Tant que vous fractionnez les données à un même 3 limite d'octet, il est le même que le fractionnement de la chaîne à la même limite de 4 caractères.

Si vous essayez de diviser les données entre ces limites, la chaîne base64 sera complété par des données jusqu'à remplissage jusqu'à la limite suivante, de sorte que le résultat ne serait pas le même.

Autres conseils

tronquer est aussi facile que l'ajout Take(12) ici:

Modifier

 byte[] hashedData = CreateSha256Hash(Row.HashString);

Pour:

 byte[] hashedData = CreateSha256Hash(Row.HashString).Take(12).ToArray();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top