Chcę zaszyfrować podaną byte[]
tablicę przy użyciu SHA1
algorytmu z użyciem SHA1Managed
. Hash będzie pochodzić z testów jednostkowych.
Oczekiwany skrót to (rozróżniana jest wielkość liter).byte[]
0d71ee4472658cd5874c5578410a9d8611fc9aef
Jak mogę to osiągnąć?
public string Hash(byte [] temp)
{
using (SHA1Managed sha1 = new SHA1Managed())
{
}
}
hex(e) == hex(E)
Odpowiedzi:
Dla tych, którzy chcą „standardowego” formatowania tekstu skrótu, możesz użyć czegoś podobnego do następującego:
static string Hash(string input) { using (SHA1Managed sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input)); var sb = new StringBuilder(hash.Length * 2); foreach (byte b in hash) { // can be "x2" if you want lowercase sb.Append(b.ToString("X2")); } return sb.ToString(); } }
Spowoduje to powstanie haszyszu
0C2E99D0949684278C30B9369B82638E1CEAD415
.Lub w przypadku wersji z kodem golfowym:
static string Hash(string input) { var hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input)); return string.Concat(hash.Select(b => b.ToString("x2"))); }
źródło
IDisposable
, ale krótka wycieczka do źródła referencyjnego pokazuje, że nic ciekawego się nie dzieje.Dispose()
x2
oznacza małe litery,X2
jest dużepublic string Hash(byte [] temp) { using (SHA1Managed sha1 = new SHA1Managed()) { var hash = sha1.ComputeHash(temp); return Convert.ToBase64String(hash); } }
EDYTOWAĆ:
Możesz również określić kodowanie podczas konwersji tablicy bajtów na ciąg w następujący sposób:
return System.Text.Encoding.UTF8.GetString(hash);
lub
return System.Text.Encoding.Unicode.GetString(hash);
źródło
0d71ee4472658cd5874c5578410a9d8611fc9aef
wynik?To jest to, z czym poszedłem. Dla tych z Was, którzy chcą zoptymalizować, sprawdź https://stackoverflow.com/a/624379/991863 .
public static string Hash(string stringToHash) { using (var sha1 = new SHA1Managed()) { return BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(stringToHash))); } }
źródło
Najszybszy sposób to:
public static string GetHash(string input) { return string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToString("X2")).ToArray()); }
W przypadku małych znaków należy użyć
x2
zamiastX2
źródło
Możesz "obliczyć wartość dla określonej tablicy bajtów" używając
ComputeHash
:var hash = sha1.ComputeHash(temp);
Jeśli chcesz przeanalizować wynik w postaci ciągu, musisz sformatować bajty przy użyciu specyfikatora
{0:X2}
formatu.źródło
Wrzucę tutaj swój kapelusz:
(jako część klasy statycznej, ponieważ ten fragment to dwa rozszerzenia)
//hex encoding of the hash, in uppercase. public static string Sha1Hash (this string str) { byte[] data = UTF8Encoding.UTF8.GetBytes (str); data = data.Sha1Hash (); return BitConverter.ToString (data).Replace ("-", ""); } // Do the actual hashing public static byte[] Sha1Hash (this byte[] data) { using (SHA1Managed sha1 = new SHA1Managed ()) { return sha1.ComputeHash (data); }
źródło