MahmoudOmar Ответов: 2

Я хочу зашифровать и расшифровать значение?


я использую этот код для шифрования значения:-
public static string Hash(string value)
        {
            return Convert.ToBase64String(
                System.Security.Cryptography.SHA256.Create()
                .ComputeHash(Encoding.UTF8.GetBytes(value))
                );
        }


Этот код когда я вставляю значение :-
private void btn_Save_Click(object sender, EventArgs e)
        {
            if (txt_ID.Text != "" && txt_Name.Text != "")
            {
                // If id is Exist........
                string IfIdisExist = "select id from name where id = @id";
                SqlCommand sqlComId = new SqlCommand(IfIdisExist, con);
                sqlComId.Parameters.AddWithValue("@id", Convert.ToInt32(txt_ID.Text));
                con.Open();
                SqlDataAdapter sda = new SqlDataAdapter(sqlComId);
                DataTable dt = new DataTable();
                sda.Fill(dt);
                con.Close();
                if (dt.Rows.Count == 0)
                {
                    string QueryHistoryLogin = "INSERT INTO Name (id, name)";
                    QueryHistoryLogin += " VALUES (@id, @name)";
                    SqlCommand sCommand = new SqlCommand(QueryHistoryLogin, con);
                    sCommand.Parameters.AddWithValue("@id", Convert.ToInt32(txt_ID.Text));
                    sCommand.Parameters.AddWithValue("@name", Hash(txt_Name.Text));
                    con.Open();
                    sCommand.ExecuteNonQuery();
                    con.Close();
                    MessageBox.Show("Success Save!");
                    txt_ID.Text = "";
                    txt_Name.Text = "";
                }
                else
                {
                    MessageBox.Show("Id is Exist!");
                }
            }
            else
            {
                MessageBox.Show("Id or name is Empty!");
            }
        }


и это код когда я получаю это значение я шифрую его чтобы отобразить в текстовом поле:-
private void btn_Search_Click(object sender, EventArgs e)
        {
            string QueryString = "select * from Name where id = @id ";
            SqlCommand cmd = new SqlCommand(QueryString, con);
            cmd.Parameters.AddWithValue("@id", Convert.ToInt32(txt_ID.Text));
            con.Open();
            SqlDataAdapter sda = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            sda.Fill(dt);
            int i = cmd.ExecuteNonQuery();
            SqlDataReader rdr = cmd.ExecuteReader();
            rdr.Read();
            string name = rdr["name"].ToString();
            con.Close();
            if(dt.Rows.Count > 0)
            {
                //txt_Name.Text = Hash(name);
            }
        }


Что я уже пробовал:

Как расшифровать значение, когда я выбираю это значение с помощью идентификатора для отображения его в текстовом поле?

2 Ответов

Рейтинг:
2

phil.o

Это хэш-функция SHA-256; хэш-функции не являются криптографическими функциями, они являются односторонними функциями и поэтому не могут быть "расшифрованы".


MahmoudOmar

хорошо, как я криптирую значение и расшифровываю

phil.o

Сначала вы должны выбрать криптографическую функцию. Один был дан в решении 2, но есть и другие.
Вы можете посмотреть на Модель криптографии .NET Framework[^]

Рейтинг:
0

OriginalGriff

Вы не можете: хэши не являются алгоритмами шифрования, и вся идея заключается в том, что они не могут быть обращены, чтобы получить исходный ввод - вот почему они используются для хранения паролей вместо функций шифрования.

Если вы хотите хранить зашифрованные данные, вам необходимо использовать функцию шифрования, такую как Triple DES или аналогичную: Класс TripleDES (Система.Безопасность.Криптография)[^]


Kenneth Haugland

- вот почему они используются для хранения паролей, а не для функций шифрования. - значит, существует более 1 правильного пароля?

lukeer

Объявление, насколько я понимаю, да. Существует неограниченное количество паролей, которые все дают один и тот же хэш и поэтому принимаются функцией проверки паролей.
Поиск такого пароля, который соответствует хэшу, называется "столкновением".
Но эти пароли невозможно угадать, глядя на хэш. Вы должны попробовать их все. И есть гораздо больше возможностей, которые не совпадают, чем те, которые совпадают.

OriginalGriff

Да, в теории. Но...не все из них являются просто допустимыми символами, которые могут быть "типизированы" - хэш-входы принимают байтовые значения неопределенной длины, поэтому количество потенциальных входов, которые вы должны попытаться получить "надежное" столкновение, намного, намного выше, чем шансы решить его с помощью атаки "грубой силы" против чисто строкового входа.
И вы не можете "работать назад" от хэш-значения и гарантировать, что получите ввод, который вы можете ввести в любой форме или форме! Вы получите допустимое значение, но оно в значительной степени бесполезно (особенно если входные данные также "соленые" - даже если вы можете ввести его, он не будет соответствовать никакому другому пользовательскому хэшу, так что это тот же самый процесс снова и снова для следующего пользователя).

Kenneth Haugland

Я читал, что если вы храните пароль с хэшами, то на самом деле делаете его слабее.

OriginalGriff

- Куда же? Я бы хотел ее прочесть.

И слабее чего? Обычный текст? Зашифровано? Имейте в виду, что зашифрованные пароли нуждаются в том, чтобы ключ был доступен всякий раз, когда вы хотите их использовать.

Kenneth Haugland

Я думал примерно так:
Войдите в систему, если GetHash(WrittenPassword)==StoredPasswordHash

имеет много => одно отношение

Если бы я использовал оригинальный пароль:
Войдите в систему, если WrittenPassword == StoredPassword

имеет:
один => одно отношение

Я что-то упустил?

OriginalGriff

Во-первых, когда вы хэшируете пароль, вы не просто хэшируете текст: вы хэшируете его значением "соли", которое уникально для пользователя (возможно, ID), так что два пользователя с одной строкой пароля генерируют разные хэши. Таким образом, вы не можете использовать знания об одном небезопасном пароле для доступа к нескольким учетным записям. Если десять пользователей имеют "пароль" в качестве пароля (а это происходит слишком часто), вы получаете десять различных хэшей, и вы не можете вернуться оттуда к исходному входу (поэтому любое значение, которое соответствует этому хэшу, обычно не может быть использовано).

Хранение паролей в виде обычного текста является простым, но серьезным риском для безопасности. Любой, кто может получить доступ к вашей базе данных (а это, вероятно, гораздо больше людей, чем вы думаете), получает идентификатор пользователя и пароль every-bodies бесплатно. Поскольку многие люди не могут запомнить более одного пароля, это дает им доступ к любой системе, к которой подключается ваш пользователь, в теории.

Хранение зашифрованных паролей также является серьезной угрозой безопасности! Подумайте об этом: шифрование требует расшифровки, прежде чем его можно будет использовать. Это означает, что ваша программа должна иметь доступ к ключу шифрования, используемому для шифрования пароля в первую очередь, каждый раз, когда вам нужно проверить, правильно ли пользователь ввел пароль. Существует очень хороший шанс, что любой, кто имеет доступ к вашей базе данных, также имеет доступ к исполняемым файлам и файлам данных вашей программы, поэтому ключ шифрования эффективно хранится вместе с данными, которые он "защищает".

Это противоречит интуиции, я знаю, но хэширование более безопасно, чем обычный текст и шифрование. Просто посмотрите на количество потерь данных за последние несколько лет: все они были связаны с системами, которые имеют систему "восстановления пароля" - что означает обычный текст или зашифрованное хранилище паролей - вместо системы "сброса пароля".

Kenneth Haugland

Понятно, если вы добавляете "соль", хэшированный пароль становится сильнее, если нет, то он слабее. Урок: вы должны сделать это правильно :-)