Comment utiliser SHA1 ou MD5 en C#?(Lequel est le meilleur en Performance et en sécurité pour L'authentification)
En C # Comment Pouvons-nous utiliser SHA1 automatiquement?
SHA1 est-il meilleur que MD5?(Nous utilisons le hachage pour le nom d'utilisateur et le mot de passe et avons besoin de vitesse pour l'authentification)
7 réponses
Vous ne savez pas ce que vous entendez automatiquement, mais vous devriez vraiment utiliser SHA256
et plus. Aussi toujours utilisation d'un Sel (code) avec vos tables de hachage. Une note de côté, une fois le temps écoulé, l'utilisation de hachages durcis est bien meilleure que l'utilisation d'une fonction de hachage simple basée sur la vitesse. C'est-à-dire: hachage sur quelques centaines d'itérations, ou utilisation de fonctions de hachage déjà éprouvées telles que bcrypt
(qui est mentionné ci-dessous, je crois). Un exemple de code pour utiliser une fonction de hachage SHA256 dans. NET est comme suit:
byte[] data = new byte[DATA_SIZE];
byte[] result;
using(SHA256 shaM = new SHA256Managed()) {
result = shaM.ComputeHash(data);
}
Fera l'affaire pour vous, en utilisant SHA256 et se trouve à MSDN.
Sidenote sur la" fissuration " de SHA1: mettre la fissuration de SHA-1 en perspective
SHA1 est plus fort que MD5 donc si vous avez le choix, il serait préférable de l'utiliser. Voici un exemple:
public static string CalculateSHA1(string text, Encoding enc)
{
byte[] buffer = enc.GetBytes(text);
SHA1CryptoServiceProvider cryptoTransformSHA1 = new SHA1CryptoServiceProvider();
return BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)).Replace("-", "");
}
Les deux sont trop rapides pour être utilisés, directement au moins. Utilisez le renforcement des clés pour "ralentir" la procédure de hachage du mot de passe. La vitesse est malheureusement l'ennemi de la sécurité par mot de passe.
Comment lent est assez lent? Ralentir un hachage de mot de passe de ~ microsecondes à ~centaines de millisecondes n'affectera pas négativement les performances perçues de votre application... mais rendra les mots de passe craquants littéralement cent mille fois plus lents.
Voir cet article pour détail: http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html
Le problème est que MD5 est rapide. Ainsi sont ses concurrents modernes, comme SHA1 et SHA256. La vitesse est un objectif de conception d'un hachage sécurisé moderne, car les hachages sont un bloc de construction de presque tous les cryptosystèmes et sont généralement exécutés à la demande par paquet ou par message.
La vitesse est exactement ce que vous ne voulez pas dans un hachage de mot de passe fonction.
... snip ...
Le jeu d'attaque de mot de passe est marqué dans le temps nécessaire pour casser le mot de passe X. Avec les tables arc-en-ciel, ce temps dépend de la taille de votre table et de la vitesse à laquelle vous pouvez la rechercher. Avec les craquelins incrémentaux, le temps dépend de la vitesse à laquelle vous pouvez exécuter la fonction de hachage du mot de passe.
Cela dit, utilisez BCrypt. SCrypt a été récemment développé, mais je doute que des bibliothèques stables (ou prêtes à la production) existent encore pour cela. Théoriquement, SCrypt prétend améliorer bcrypt. "Construire le vôtre" n'est pas recommandé, mais itérer MD5 / SHA1 / SHA256 des milliers de fois devrait faire l'affaire (Ie: renforcement des clés).
Et au cas où vous ne les connaissez pas, assurez-vous de lire sur les Tables arc-en-ciel. La sécurité de base, trucs.
À Partir de MSDN
byte[] data = new byte[DATA_SIZE];
byte[] result;
SHA1 sha = new SHA1CryptoServiceProvider();
// This is one implementation of the abstract class SHA1.
result = sha.ComputeHash(data);
Utiliser SHA1 ou SHA2 L'algorithme MD5 est problématique.
Http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5%28v=vs.85%29.aspx
J'aimerais utiliser ces choses.
MD5, SHA1/256/384/512 avec un paramètre D'encodage facultatif.
Ailleurs Hashalgorithmes .Merci à Darin Dimitrov.
public static string MD5Of(string text)
{
return MD5Of(text, Encoding.Default);
}
public static string MD5Of(string text, Encoding enc)
{
return HashOf<MD5CryptoServiceProvider>(text, enc);
}
public static string SHA1Of(string text)
{
return SHA1Of(text, Encoding.Default);
}
public static string SHA1Of(string text, Encoding enc)
{
return HashOf<SHA1CryptoServiceProvider>(text, enc);
}
public static string SHA384Of(string text)
{
return SHA384Of(text, Encoding.Default);
}
public static string SHA384Of(string text, Encoding enc)
{
return HashOf<SHA384CryptoServiceProvider>(text, enc);
}
public static string SHA512Of(string text)
{
return SHA512Of(text, Encoding.Default);
}
public static string SHA512Of(string text, Encoding enc)
{
return HashOf<SHA512CryptoServiceProvider>(text, enc);
}
public static string SHA256Of(string text)
{
return SHA256Of(text, Encoding.Default);
}
public static string SHA256Of(string text, Encoding enc)
{
return HashOf<SHA256CryptoServiceProvider>(text, enc);
}
public static string HashOf<TP>(string text, Encoding enc)
where TP: HashAlgorithm, new()
{
var buffer = enc.GetBytes(text);
var provider = new TP();
return BitConverter.ToString(provider.ComputeHash(buffer)).Replace("-", "");
}
MD5 est meilleur dans les performances et SHA1 est meilleur pour la sécurité. Vous pouvez obtenir une idée de cette comparaison