Mam problem, gdy próbuję uzyskać ciąg skrótu c#
.
Wypróbowałem już kilka witryn internetowych, ale większość z nich używa plików do uzyskania skrótu. Inne, które są przeznaczone na smyczki, są nieco zbyt złożone. Znalazłem przykłady uwierzytelniania systemu Windows dla stron internetowych, takie jak:
FormsAuthentication.HashPasswordForStoringInConfigFile(tbxPassword.Text.Trim(), "md5")
Muszę użyć skrótu, aby uczynić ciąg zawierający nazwę pliku bardziej bezpiecznym. Jak mogę to zrobić?
Przykład:
string file = "username";
string hash = ??????(username);
Czy powinienem użyć innego algorytmu mieszającego, a nie „md5”?
b.ToString("X2")
oznacza?Najszybszym sposobem uzyskania skrótu do przechowywania haseł jest następujący kod:
internal static string GetStringSha256Hash(string text) { if (String.IsNullOrEmpty(text)) return String.Empty; using (var sha = new System.Security.Cryptography.SHA256Managed()) { byte[] textData = System.Text.Encoding.UTF8.GetBytes(text); byte[] hash = sha.ComputeHash(textData); return BitConverter.ToString(hash).Replace("-", String.Empty); } }
Uwagi:
sha
zmiennej powinno zostać refaktoryzowane na pole klasy;źródło
SHA1Managed
klasa nie jest zbyt kosztowna. zużywa około 130 bajtów i inicjalizuje je do jakiejś statycznej wartości, ale to wszystko. więc w większości przypadków nie powinno być problemu z wydajnością.SHA1Managed
Jest równieżIDisposable
i dlatego wymaga, aby zawinąć jego użycie wusing
blok.Dispose
metody jest wyczyszczenie bufora wewnętrznego. Niezastosowanie się do tego grozi atakiem pamięci.SHA1Managed
nie jest kosztowne, mam na myśli, że jego tworzenie nie jest. Ponadto algorytm haszujący nie jest konieczny kosztowny. To musi być (niezwykle) kosztowne tylko wtedy, gdy chcesz znaleźć kolizję.Naprawdę nie rozumiem całego zakresu twojego pytania, ale jeśli potrzebujesz tylko skrótu łańcucha, bardzo łatwo to uzyskać.
Po prostu użyj metody GetHashCode.
Lubię to:
string hash = username.GetHashCode();
źródło
GetHashCode
nie jest to szyfrowany algorytm haszujący. Użyj co najmniej SHA256 lub nawet lepiej użyj BCrypt lub Scrypt dla bezpiecznego algorytmu.Myślę, że to, czego szukasz, to nie haszowanie, ale szyfrowanie. Dzięki haszowaniu nie będziesz w stanie odzyskać oryginalnej nazwy pliku ze zmiennej „hash”. Dzięki szyfrowaniu możesz i jest to bezpieczne.
Zobacz AES w ASP.NET z VB.NET, aby uzyskać więcej informacji na temat szyfrowania w .NET.
źródło
//Secure & Encrypte Data public static string HashSHA1(string value) { var sha1 = SHA1.Create(); var inputBytes = Encoding.ASCII.GetBytes(value); var hash = sha1.ComputeHash(inputBytes); var sb = new StringBuilder(); for (var i = 0; i < hash.Length; i++) { sb.Append(hash[i].ToString("X2")); } return sb.ToString(); }
źródło
Jeżeli wydajność nie jest głównym problemem, można również użyć jednej z następujących metod:
(W przypadku, gdy chciał ciąg mieszania się wielkimi literami, należy wymienić
"x2"
z"X2"
).public static string SHA256ToString(string s) { using (var alg = SHA256.Create()) return string.Join(null, alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Select(x => x.ToString("x2"))); }
lub:
public static string SHA256ToString(string s) { using (var alg = SHA256.Create()) return alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Aggregate(new StringBuilder(), (sb, x) => sb.Append(x.ToString("x2"))).ToString(); }
źródło
Najkrótsza i najszybsza droga w historii. Tylko 1 linia!
public static string StringSha256Hash(string text) => string.IsNullOrEmpty(text) ? string.Empty : BitConverter.ToString(new System.Security.Cryptography.SHA256Managed().ComputeHash(System.Text.Encoding.UTF8.GetBytes(text))).Replace("-", string.Empty);
źródło