Du bist nicht angemeldet.

Werbeanzeige

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

1

08.05.2019, 11:15

Unity - BCrypt Login

Hi,

Ich bastle an einem kleinen Login-System auf Basis von C# TcpClient und TcpServer.


Bei der Registrierung wird ein Salt und das mit BCrypt gehashtes Passwort in die Datenbank gespeichert (das funktioniert).

Meine Encryption-Klasse sieht so aus:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Encryption
    {
        public static string PasswordSalt(int length = 6)
        {
            string salt = BCrypt.Net.BCrypt.GenerateSalt(12);
            salt = salt.Substring(0, length);
            return salt;
        }
        public static string HashPassword(string password, string salt)
        {
            try
            {
                string hash = BCrypt.Net.BCrypt.HashPassword(password, salt);
                return hash;
            }
            catch (Exception e)
            {
                return (string)null;
            }
        }

        public static bool ValidatePassword(string password, string salt, string correcthash)
        {
            try
            { 
                return BCrypt.Net.BCrypt.Verify(password, correcthash);
            }
            catch
            {
                return false;
            }
        }
    }


Das Problem ist, dass die ValidatePassword-Methode immer False zurück gibt. Wenn ich das gleiche Password durch die HashPassword-Methode schickt, kommt immer ein anderer Hash raus.



Wo liegt mein Fehler?



Gruß

GolWinStu

Treue Seele

Beiträge: 355

Wohnort: Heidelberg

Beruf: Softwareentwickler, Vertriebler

  • Private Nachricht senden

2

08.05.2019, 11:47

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public static class Encryption
    {
        private static string PasswordSalt(int length = 6)
        {
            return BCrypt.Net.BCrypt.GenerateSalt(length);
        }
        private static string HashPassword(string password, string salt)
        {
            return BCrypt.Net.BCrypt.HashPassword(password, salt);
        }

        public static bool ValidatePassword(string password, string salt, string correcthash)
        {
            if(HashPassword(password, salt).equals(correcthash))
            { 
                return true;
            }
            else
            {
                return false;
            }
        }
    }


so würde ich das machen.

Habs nicht getestet, aber so macht es zumindest Sinn. Probiers mal aus ;)


PS: warum machst du das hier?

C#-Quelltext

1
2
3
4
5
6
        public static string PasswordSalt(int length = 6)
        {
            string salt = BCrypt.Net.BCrypt.GenerateSalt(12);
            salt = salt.Substring(0, length);
            return salt;
        }


dadurch bringst du unnötig Komplexität rein. Siehe mein Code oben.

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

3

08.05.2019, 17:02

Hi,

in der Methode

C#-Quelltext

1
2
3
4
private static string HashPassword(string password, string salt)
{
   return BCrypt.Net.BCrypt.HashPassword(password, salt);
}

bekomm ich die Exception {"Der Index war außerhalb des Arraybereichs."} System.IndexOutOfRangeException


Woran kann das denn liegen? Ich hab mit BCrypt noch nicht so viel Erfahrung.




Gruß

GolWinStu

Treue Seele

Beiträge: 355

Wohnort: Heidelberg

Beruf: Softwareentwickler, Vertriebler

  • Private Nachricht senden

4

09.05.2019, 09:21

Okay, war auch eher geraten.

BCrypt hab ich relativ schnell rausgeschmissen und setze nun auf das hier: https://docs.microsoft.com/de-de/dotnet/…etframework-4.8

Du bekommst das Passwort und generierst den Hash und concatinierst beides in der ComputeHash-Funktion und du hast deinen Salted Hash die du dann mit .Equals mit einem Passwort-Hash aus der DB vergleichst.

Du musst dann halt neue Hashes erstellen in der DB, BCrypt != SHA512Managed

Als Salt nimmste einfach sowas: https://stackoverflow.com/a/1344242/3992990
(Muss kein Hexenwerk sein, musste aber dann natürlich auch in der DB ablegen)

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 139

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

5

09.05.2019, 10:05

Hi,

auf die SHA512Managed-Klasse bin ich auch gestoßen. Im Prinzip hab ich es so gemacht wie du geschrieben hast, und es funktioniert wunderbar.

Jetzt hab ich noch die Frage, wie ich am Besten die Verbindung vom Client zum Server verschlüsseln kann, weil ja das Password in Klartext übertragen wird.
Gibts dafür eine Lösung?



Gruß

GolWinStu

Treue Seele

Beiträge: 355

Wohnort: Heidelberg

Beruf: Softwareentwickler, Vertriebler

  • Private Nachricht senden

6

09.05.2019, 17:05

SSL ;)

Ich habe mir bereits überlegt, einfach das Passwort im Frontend zu hashen, aber das macht keinen Sinn und bietet zu viel Angriffsfläche für Probleme.

Einfach eine SSL geschützte Verbindung aufbauen und das sollte es gewesen sein. Macht jeder so.

Werbeanzeige