Как хранить и извлекать соль из базы данных и в нее? - PullRequest
0 голосов
/ 10 апреля 2020

Мне удалось написать набор методов, чтобы получить пароль, добавить соль и сохранить соль и хешированный пароль в базе данных. Но когда я пытаюсь извлечь и напечатать соль, она выводит System.byte[] вместо строки соли. Я думаю, что есть проблема с типами возвращаемых методов. Вот мои методы,

class HashSalt
    {

        private readonly int num_of_iterations;

        // --- constructor to initialize num_of_iterations
        public HashSalt(int numOfIterations)
        {
            num_of_iterations = numOfIterations;
        }

        // --- Generate Salt ---
        public string  generateSalt()
        {
            var salt = new byte[32];

            var randomProvider = new RNGCryptoServiceProvider();
            randomProvider.GetBytes(salt);

            return Convert.ToBase64String(salt);        // returns salt as a string
        }

        // --- converts salt string into byte[]
        public byte[] saltToByte(string salt)
        {
            var byteSalt = Convert.FromBase64String(salt);
            return byteSalt;
        }

        // --- Generate hash of(pass+salt) ---
        public string generateHash(string password, byte[] salt)
        {

            var rfc2898 = new Rfc2898DeriveBytes(password, salt, num_of_iterations);

            var Password = rfc2898.GetBytes(32);    // gives 32 byte encoded password

            return Convert.ToBase64String(Password);    // returns hash
        }
    }

Структура базы данных enter image description here

Код, используемый для сохранения в базе данных

DbHandler db = new DbHandler();
                MySqlCommand cmd = new MySqlCommand("INSERT INTO `student`(`indexno`,`firstname`,`lastname`,`address`,`gender`,`dob`,`email`,`faculty`,`mobile`,`password`,`salt`)VALUES(@index, @firstname, @lastname, @address, @gender, @dob, @email, @faculty, @mobile, @password, @salt);", db.getConnection());


                var salt = hashSalt.generateSalt();  // generates random salt type string
                var byteSalt = hashSalt.saltToByte(salt);   // gets byte[] from salt string

                cmd.Parameters.Add("@index", MySqlDbType.VarChar).Value = txtindex.Text;
                cmd.Parameters.Add("@firstname", MySqlDbType.VarChar).Value = txtfname.Text;
                cmd.Parameters.Add("@lastname", MySqlDbType.VarChar).Value = txtlname.Text;
                cmd.Parameters.Add("@address", MySqlDbType.VarChar).Value = txtaddress.Text;
                cmd.Parameters.Add("@gender", MySqlDbType.VarChar).Value = getGender();
                cmd.Parameters.Add("@dob", MySqlDbType.Date).Value = dateDob.Value.Date;
                cmd.Parameters.Add("@email", MySqlDbType.VarChar).Value = txtemail.Text;
                cmd.Parameters.Add("@faculty", MySqlDbType.VarChar).Value = cmbfaculty.GetItemText(cmbfaculty.SelectedItem);
                cmd.Parameters.Add("@mobile", MySqlDbType.VarChar).Value = txtmobile.Text;
                cmd.Parameters.Add("@password", MySqlDbType.VarChar).Value = hashSalt.generateHash(txtpassword.Text, byteSalt); // get (password+salt) hashed from db 
                cmd.Parameters.Add("@salt", MySqlDbType.VarBinary).Value = salt;

                db.openConnection();    // open connection
                // execute query
                if (cmd.ExecuteNonQuery() == 1)
                {
                    MessageBox.Show("Record added!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("Failed!, please retry", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                db.openConnection();    // close connection

Надеемся решить эту проблему.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Но когда я пытаюсь извлечь и напечатать соль, вместо строки соли выводится System.byte []. Надеясь решить эту проблему.

Если не указать String, WriteLine и наиболее похожий код возьмут объект и вызовут ToString() для него.

Реализация по умолчанию ToString() возвращает имя класса в виде строки - System.byte[] в вашем случае - которая затем может быть напечатана. Классы должны переопределить ToString(), если они хотят что-то более полезное для отладки. Например, String, возвращая себя или его копию (я думаю, что первый, но я должен был бы изучить код).

Не существует автомата c, который будет пытаться перебирать массивы или другие коллекции тоже. Это только автоматически напечатает имя класса. Если вы хотите, чтобы содержимое коллекции было напечатано, вы должны выполнить итерации по ней вручную - и, возможно, рекурсивно - добавив правильный разделитель и аннотации. Простой foreach должен сделать для этого случая. Однако я не уверен, как вы хотите конвертировать каждый байт в строку или символ здесь. Обычно вы печатаете один байт в виде шестнадцатеричного значения 2 di git.

0 голосов
/ 10 апреля 2020

Нашел, проблема в типе данных столбца соли в базе данных, он установлен на varBinary , но возвращает тип метода generateSalt() is string и эта строка отправляется для сохранения в базе данных. Поэтому все, что мне нужно было сделать, это изменить тип данных столбец соли в базе данных на varchar .

...