none
Argon2i - Hash erzeugen RRS feed

  • 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

    Mittwoch, 24. Juni 2020 08:58

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

    Mittwoch, 28. Oktober 2020 15:30

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

    Mittwoch, 24. Juni 2020 09:46
    Moderator
  • 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

    Mittwoch, 24. Juni 2020 12:40
  • Hallo Fachleute,

    kann mir keiner helfen? Kann doch eigentlich nicht sein, dass man über PHP, Phyton und Java, nicht aber über DotNet diese Hashwerte erzeugen kann!?

    Gruß

    Vincent

    Donnerstag, 2. Juli 2020 11:29
  • Hallo nochmal,

    hat jemand vielleicht eine Lösung für das Problem gefunden?

    Vielen Dank!

    Gruß

    Vincent

    Freitag, 31. Juli 2020 06:13
  • 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

    Dienstag, 29. September 2020 14:40
  • 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

    Mittwoch, 28. Oktober 2020 15:30