System.NotSupportedException: Logowanie / rejestracja

0

Witajcie,

Poszukiwałem prostej metody do szyfrowania hasła, które będzie wpadało do bazy danych. Przy rejestracji użytkownik tworzy sobie hasło, następnie ono jest szyfrowane i wrzucane do bazy danych. Przy logowaniu następuje deszyfrowanie.

public static class StringUtil
{
    private static byte[] key = new byte[8] {1, 2, 3, 4, 5, 6, 7, 8};
    private static byte[] iv = new byte[8] {1, 2, 3, 4, 5, 6, 7, 8};

    public static string Crypt(this string text)
    {
        SymmetricAlgorithm algorithm = DES.Create();
        ICryptoTransform transform = algorithm.CreateEncryptor(key, iv);
        byte[] inputbuffer = Encoding.Unicode.GetBytes(text);
        byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
        return Convert.ToBase64String(outputBuffer);
    }

    public static string Decrypt(this string text)
    {
        SymmetricAlgorithm algorithm = DES.Create();
        ICryptoTransform transform = algorithm.CreateDecryptor(key, iv);
        byte[] inputbuffer = Convert.FromBase64String(text);
        byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
        return Encoding.Unicode.GetString(outputBuffer);
    }
}

Przy rejestracji przy tworzeniu nowego obiektu po prostu wywołuję metodę:

 Users_login newUser = new Users_login();
                        newUser.Login = Login;
                        newUser.Password = Crypt(Password);
                        db.Users_logins.InsertOnSubmit(newUser);

I wszystko działa.

Niestety przy logowaniu czyli wywołaniu metody Decrypt:

   var query = (from x in db.Users_logins
                                where x.Login == login && Decrypt(x.Password) == password
                                select x);

                    if (query.Count()!=1)
                    {
                        MessageBox.Show("Your password or login is not valid, please try again");
                    }

                    else
                    {
                        MessageBox.Show("Success! You're logged!");
                    }

Otrzymuję błąd: "System.NotSupportedException: 'Brak obsługiwanego tłumaczenia na język SQL dla metody „System.String Decrypt(System.String)”.'
" W jaki sposób mogę rozwiązać tą sytuację?

0

decrypt ma kod C# a oczekiwany jest SQL. Twojej metody nie potrafi przetlumaczyc na SQL

poczytaj jak powinno sie obslugiwac logowanie uzytownika z dekryptowaniem hasla

5

###1 - tego się tak nie robi

Nie szyfruje się haseł tylko hashuje - użyj jakiegoś sensownego algorytmu hashowania (najlepiej scrypt albo innego PBKDF, w ostateczności SHA256, w ostateczności SHA1).

###2 - to tak nie zadziała

Linq2Sql próbuje wywołać metodę Decrypt w SQL, co oczywiście sie nie udaje. Musisz zrobić coś w stylu

var encryptedPassword = Encrypt(x.Password)
 var query = (from x in db.Users_logins
                                where x.Login == login && x.Password == encryptedPassword
                                select x);

(ale nie używaj tego kodu! Zmień szyfrowanie haseł na hashowanie).

0

Fakt, to nie wygląda to dobrze :D

public string Hash(string password)
{
    var bytes = new UTF8Encoding().GetBytes(password);
    byte[] hashBytes;
    using (var algorithm = new System.Security.Cryptography.SHA512Managed())
    {
        hashBytes = algorithm.ComputeHash(bytes);
    }
    return Convert.ToBase64String(hashBytes);
}

Oczywiście to jakaś znaleziona pierwsza z brzegu na Stacku funkcja haszująca, ale rozumiem, że cały proces wygląda tak, że przy rejestracji podajemy hasło, które poddawane jest haszowaniu i wrzucane do bazy. Przy weryfikacji sprawdzamy, czy wpisane w textBox hasło , które poddane jest tej samej funkcji haszującej jest zgodne z tym, które jest w bazie? Dobrze rozumiem?

1

Tak, dobrze to rozumiesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1