Код шифрования / дешифрования пароля в .NET

Что произойдет, если браузер получит ответ перенаправления на запрос ajax?

Если сервер отправляет перенаправление (например, ответ 302 плюс заголовок Location), перенаправление автоматически следует браузер. Ответ на второй запрос (при условии, что он также не является другим перенаправлением) - это то, что доступно вашей программе.

На самом деле у вас нет возможности обнаруживать произошел ли ответ 302. Если перенаправление 302 приводит к 200, то ваша программа действует одинаково, как если бы исходный запрос приводил непосредственно к 200.

Это был как мой опыт, так и поведение , вызванное в spec .

2016 Обновление: прошло время, и хорошей новостью является то, что новый fetch () API предложил предложить более мелкозернистый элемент управления о том, как обрабатываются переадресации , с поведением по умолчанию, аналогичным XHR. Тем не менее, он работает только там, где fetch () реализован изначально . Полиморфные версии fetch () , которые основаны на XHR- , продолжают иметь ограничения XHR . К счастью, поддержка родного браузера , кажется, хорошо округляется.

24
задан Cœur 26 June 2018 в 10:22
поделиться

6 ответов

Вот и все. Я нашел это где-то в Интернете. У меня работает хорошо.

    /// <summary>
    /// Encrypts a given password and returns the encrypted data
    /// as a base64 string.
    /// </summary>
    /// <param name="plainText">An unencrypted string that needs
    /// to be secured.</param>
    /// <returns>A base64 encoded string that represents the encrypted
    /// binary data.
    /// </returns>
    /// <remarks>This solution is not really secure as we are
    /// keeping strings in memory. If runtime protection is essential,
    /// <see cref="SecureString"/> should be used.</remarks>
    /// <exception cref="ArgumentNullException">If <paramref name="plainText"/>
    /// is a null reference.</exception>
    public string Encrypt(string plainText)
    {
        if (plainText == null) throw new ArgumentNullException("plainText");

        //encrypt data
        var data = Encoding.Unicode.GetBytes(plainText);
        byte[] encrypted = ProtectedData.Protect(data, null, Scope);

        //return as base64 string
        return Convert.ToBase64String(encrypted);
    }

    /// <summary>
    /// Decrypts a given string.
    /// </summary>
    /// <param name="cipher">A base64 encoded string that was created
    /// through the <see cref="Encrypt(string)"/> or
    /// <see cref="Encrypt(SecureString)"/> extension methods.</param>
    /// <returns>The decrypted string.</returns>
    /// <remarks>Keep in mind that the decrypted string remains in memory
    /// and makes your application vulnerable per se. If runtime protection
    /// is essential, <see cref="SecureString"/> should be used.</remarks>
    /// <exception cref="ArgumentNullException">If <paramref name="cipher"/>
    /// is a null reference.</exception>
    public string Decrypt(string cipher)
    {
        if (cipher == null) throw new ArgumentNullException("cipher");

        //parse base64 string
        byte[] data = Convert.FromBase64String(cipher);

        //decrypt data
        byte[] decrypted = ProtectedData.Unprotect(data, null, Scope);
        return Encoding.Unicode.GetString(decrypted);
    }
16
ответ дан 28 November 2019 в 05:35
поделиться

Я использую RC2CryptoServiceProvider.

    public static string EncryptText(string openText)
    {
        RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider();
        ICryptoTransform encryptor = rc2CSP.CreateEncryptor(Convert.FromBase64String(c_key), Convert.FromBase64String(c_iv));
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                byte[] toEncrypt = Encoding.Unicode.GetBytes(openText);

                csEncrypt.Write(toEncrypt, 0, toEncrypt.Length);
                csEncrypt.FlushFinalBlock();

                byte[] encrypted = msEncrypt.ToArray();

                return Convert.ToBase64String(encrypted);
            }
        }
    }

    public static string DecryptText(string encryptedText)
    {
        RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider();
        ICryptoTransform decryptor = rc2CSP.CreateDecryptor(Convert.FromBase64String(c_key), Convert.FromBase64String(c_iv));
        using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(encryptedText)))
        {
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            {
                List<Byte> bytes = new List<byte>();
                int b;
                do
                {
                    b = csDecrypt.ReadByte();
                    if (b != -1)
                    {
                        bytes.Add(Convert.ToByte(b));
                    }

                }
                while (b != -1);

                return Encoding.Unicode.GetString(bytes.ToArray());
            }
        }
    }
3
ответ дан Pavel Belousov 26 June 2018 в 10:22
поделиться

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

с использованием System.Security.Cryptography;

    public static string EncryptSHA512Managed(string password)
    {
        UnicodeEncoding uEncode = new UnicodeEncoding();
        byte[] bytPassword = uEncode.GetBytes(password);
        SHA512Managed sha = new SHA512Managed();
        byte[] hash = sha.ComputeHash(bytPassword);
        return Convert.ToBase64String(hash);
    }
-1
ответ дан Case 26 June 2018 в 10:22
поделиться

РЕДАКТИРОВАТЬ: это очень старый ответ. SHA1 устарел в 2011 году и теперь не работает на практике. https://shattered.io/ Вместо этого используйте более новый стандарт (например, SHA256, SHA512 и т. Д.).

Если ваш ответ на вопрос в моем комментарии - «Нет», вот что я использую:

    public static byte[] HashPassword(string password)
    {
        var provider = new SHA1CryptoServiceProvider();
        var encoding = new UnicodeEncoding();
        return provider.ComputeHash(encoding.GetBytes(password));
    }
11
ответ дан 28 November 2019 в 05:35
поделиться

На этот вопрос будет дан ответ, как зашифровать / расшифровать: Зашифровать и расшифровать строку на C #?

Вы не указали базу данных, но вы захотите закодировать ее в формате base-64, используя Convert.toBase64String. В качестве примера вы можете использовать: http://www.opinionatedgeek.com/Blog/blogentry=000361/BlogEntry.aspx

Затем вы сохраните его в виде varchar или blob, в зависимости от того, как долго ваше зашифрованное сообщение, но для пароль varchar должен работать.

В приведенных выше примерах также рассматривается дешифрование после декодирования base64.

ОБНОВЛЕНИЕ:

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

3
ответ дан 28 November 2019 в 05:35
поделиться

Один из простейших методов шифрования (если вы абсолютно ДОЛЖНЫ придумать его самостоятельно, поскольку в .NET уже есть такие замечательные библиотеки шифрования [как предоставлено Cogwheel непосредственно передо мной]) является Выполните операцию XOR значения ASCII каждого символа входной строки с известным «ключевым» значением. Функциональность XOR в C #, как я полагаю, осуществляется с помощью клавиши ^.

Затем вы можете преобразовать значения обратно из результата XOR в символы ASCII и сохранить их в базе данных. Это не очень безопасно, но это один из самых простых методов шифрования.

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

0
ответ дан 28 November 2019 в 05:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: