Benutzer mit den meisten Antworten
Argon2i - Hash erzeugen

Frage
-
Moin zusammen,
ich muss mir für eine Typo3 Administrationssoftware einen Hash Wert für Passworte erzeugen. Ich habe über diese Seite auch eine gute Anleitung zur Nutzung von Konscious.Security.Cryptography gefunden. Ich habe die C# Version auf meine VB.Net Welt erfolgreich portiert und kann auch Hash-Werte erzeugen. Die Parameter am Anfang habe ich entsprechend ergänzt. Leider sind diese Werte nicht identisch mit denen, die ich über Online-Generatoren wie Argon2.Online erstellen kann. Sie sind deutlich kürzer, und ich verstehe einfach nicht warum.
Ein Online generierter Hash würde etwa so aussehen:
"$argon2i$v=19$m=1048576,t=4,p=8$9m35jyZUsdtJ8ON2K6xAjg$dMIdvc17guXazUEo2/DWyih10h7AoK3m+KuHan40yI8"
Meiner sieht so aus:
"$argon2i$v=19$m=1048576,t=4,p=8$q7iuMDp4KLhjI92gth2P5g=="
Meine Testwerte sind:
Passwort: HelloWorld!
Memory (m): 1048576
Iterations/Time (t): 4
Hash length: 16
Parallelism (p): 8
Salt: zufällig und fest getestet
Die Online generierten Werte funktionieren mit Typo3, meine leider nicht.
Alle Beispiele die ich gefunden habe für Java, PHP und Python ergeben (zumindest in der Theorie) die gewünschten Hash-Werte.
Ich weiß nicht mehr was ich noch testen soll. Ich vermute ein Problem mit den Base64 Bytes, bin da aber wirklich kein Fachmann. Im Artikel ist das Ergebnis ehrlich gesagt auch relativ kurz. Ich nehme auch gerne eine andere Net-Erweiterung.
Kann jemand helfen?
Vielen Dank im Voraus für die Mühe.
Gruß
Vincent
Antworten
-
Hi Vincent,
so wie ich das sehe fehlt bei deinem Hash String die Einbettung des Salt. Der Aufbau des Argon2 Hash Strings ist hier recht gut beschrieben: https://framework.zend.com/blog/2017-08-17-php72-argon2-hash-password.html
Außerdem musst du um gleiche Ergebnisse zu erhalten drauf achten, welche Hash-Länge du für deinen Argon2 Hash wählst. Bei den meisten Online-Generatoren ist dies ein einstellbarer Parameter. Bei deinem Beispiel sieht es so aus, als wäre die Hash-Länge des Online-Generators auf 32 Byte gesetzt. In deinem C# Code jedoch erzeugst du nur einen Hash mit Länge 16 Bytes. Versuchs also entsprechend mal mit
return argon2.GetBytes(32); // Length
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 5. Januar 2021 12:01
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 19. Oktober 2021 11:45
Alle Antworten
-
Hallo Vincent,
poste bitte deinen Code, mit dem Du den Hash erzeugst. Dann kann man sich das anschauen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport -
Hallo Stefan,
habe das ganze mal in C# neu erstellt. Vielen Dank für die Mühe.
//https://www.twelve21.io/how-to-use-argon2-for-password-hashing-in-csharp/ //https://www.nuget.org/packages/Konscious.Security.Cryptography.Argon2/ //Install-Package Konscious.Security.Cryptography.Argon2 -Version 1.2.1 //https://antelle.net/argon2-browser/ //https://argon2.online/ using System; using System.Security.Cryptography; using Konscious.Security.Cryptography; using System.Diagnostics; using System.Linq; namespace Crypto_Argon2i_c_Console { class Program { static void Main(string[] args) { //Console.WriteLine("Hello World!"); Program program = new Program(); program.Run(); } private byte[] CreateSalt() { var buffer = new byte[16]; var rng = new RNGCryptoServiceProvider(); rng.GetBytes(buffer); return buffer; } private byte[] HashPassword(string password, byte[] salt) { var argon2 = new Argon2i(System.Text.Encoding.UTF8.GetBytes(password)); // Argon2i argon2.Salt = salt; argon2.DegreeOfParallelism = 8; // four cores argon2.Iterations = 4; argon2.MemorySize = 65536; return argon2.GetBytes(16); // Length } private bool VerifyHash(string password, byte[] salt, byte[] hash) { var newHash = HashPassword(password, salt); return hash.SequenceEqual(newHash); } public void Run() { var password = "Hello World!"; var stopwatch = Stopwatch.StartNew(); Console.WriteLine($"Creating hash for password '{ password }'."); var salt = CreateSalt(); Console.WriteLine($"Using salt '{ Convert.ToBase64String(salt) }'."); var hash = HashPassword(password, salt); Console.WriteLine(); Console.WriteLine($"Hash ist '{ Convert.ToBase64String(hash) }'."); Console.WriteLine($"PHP-Hash '$argon2i$v=19$m=65536,t=4,p=8${ Convert.ToBase64String(hash) } (Salt: zufall)'"); //nur zu Testzwecken als fester Wert Console.WriteLine($"Erwartet '$argon2i$v=19$m=65536,t=4,p=8$MTIzNDU2Nzg5MA$mZ3Oe71H0GN1rQ6Uh2BcwQ' (Salt: '1234567890')"); //Online Generator Console.WriteLine(); stopwatch.Stop(); Console.WriteLine($"Process took { stopwatch.ElapsedMilliseconds / 1024.0 } s"); stopwatch = Stopwatch.StartNew(); Console.WriteLine($"Verifying hash..."); var success = VerifyHash(password, salt, hash); Console.WriteLine(success ? "Success!" : "Failure!"); stopwatch.Stop(); Console.WriteLine($"Process took { stopwatch.ElapsedMilliseconds / 1024.0 } s"); } } }
Gruß
Vincent
-
Hallo Fachwelt,
hat nicht vielleicht doch noch jemand eine Idee? Alternativ würde ich über andere Sprachen das Passwort generieren lassen müssen. Ich kann nur nicht glauben, dass das mit .Net nicht geht.
Wenn es einen Weg über MS-SQL geben sollte, nehme ich auch gerne den.
Mit einem hoffnungsvollen Gruß
Vincent
-
Hi Vincent,
so wie ich das sehe fehlt bei deinem Hash String die Einbettung des Salt. Der Aufbau des Argon2 Hash Strings ist hier recht gut beschrieben: https://framework.zend.com/blog/2017-08-17-php72-argon2-hash-password.html
Außerdem musst du um gleiche Ergebnisse zu erhalten drauf achten, welche Hash-Länge du für deinen Argon2 Hash wählst. Bei den meisten Online-Generatoren ist dies ein einstellbarer Parameter. Bei deinem Beispiel sieht es so aus, als wäre die Hash-Länge des Online-Generators auf 32 Byte gesetzt. In deinem C# Code jedoch erzeugst du nur einen Hash mit Länge 16 Bytes. Versuchs also entsprechend mal mit
return argon2.GetBytes(32); // Length
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 5. Januar 2021 12:01
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 19. Oktober 2021 11:45