it-swarm.com.de

Kennwortverschlüsselungs-/Entschlüsselungscode in .NET

Ich möchte eine einfache Verschlüsselung und Entschlüsselung des Passworts in C #. Wie kann man das Passwort in verschlüsselter Form in der Datenbank speichern und als Originalformat durch Entschlüsselung abrufen?

24
kart

Bitte schön. Ich habe es irgendwo im Internet gefunden. Funktioniert gut für mich.

    /// <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

EDIT: Dies ist eine sehr alte Antwort. SHA1 wurde 2011 nicht mehr empfohlen und ist nun in der Praxis gebrochen. https://shattered.io/ Verwenden Sie stattdessen einen neueren Standard (z. B. SHA256, SHA512 usw.).

Wenn Ihre Antwort auf die Frage in meinem Kommentar "Nein" lautet, verwende ich Folgendes:

    public static byte[] HashPassword(string password)
    {
        var provider = new SHA1CryptoServiceProvider();
        var encoding = new UnicodeEncoding();
        return provider.ComputeHash(encoding.GetBytes(password));
    }
11
Cogwheel

Diese Frage wird beantworten, wie man verschlüsselt/entschlüsselt: Eine Zeichenfolge verschlüsseln und entschlüsseln

Sie haben keine Datenbank angegeben, Sie möchten sie jedoch mit base-64 codieren, indem Sie Convert.toBase64String ..__ verwenden. Als Beispiel können Sie Folgendes verwenden: http://www.opinionatedgeek.com/Blog /blogentry=000361/BlogEntry.aspx

Sie speichern sie dann entweder in einem Varchar oder einem Clob, je nachdem, wie lange Ihre verschlüsselte Nachricht ist. Für ein Kennwort sollte jedoch ein Varchar funktionieren.

Die obigen Beispiele beziehen sich auch auf die Entschlüsselung nach dem Entschlüsseln der Base64

UPDATE: 

Tatsächlich benötigen Sie möglicherweise keine base64-Codierung, aber ich fand es hilfreich, falls ich es ausdrucken oder über das Web senden wollte. Wenn die Nachricht lang genug ist, fand ich es hilfreich, sie zuerst zu komprimieren und dann zu verschlüsseln, da die Verwendung von Brute-Force schwieriger ist, wenn die Nachricht bereits in einer binären Form vorliegt. Daher ist es schwer zu sagen, wann die Verschlüsselung erfolgreich gebrochen wurde .

3
James Black

Ich benutze 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

Erstellen Sie zuerst eine Klasse wie: 

public class Encryption
    { 
        public static string Encrypt(string clearText)
        {
            string EncryptionKey = "MAKV2SPBNI99212";
            byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
            using (Aes encryptor = Aes.Create())
            {
                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
                encryptor.Key = pdb.GetBytes(32);
                encryptor.IV = pdb.GetBytes(16);
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(clearBytes, 0, clearBytes.Length);
                        cs.Close();
                    }
                    clearText = Convert.ToBase64String(ms.ToArray());
                }
            }
            return clearText;
        }

        public static string Decrypt(string cipherText)
        {
            string EncryptionKey = "MAKV2SPBNI99212";
            byte[] cipherBytes = Convert.FromBase64String(cipherText);
            using (Aes encryptor = Aes.Create())
            {
                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
                encryptor.Key = pdb.GetBytes(32);
                encryptor.IV = pdb.GetBytes(16);
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(cipherBytes, 0, cipherBytes.Length);
                        cs.Close();
                    }
                    cipherText = Encoding.Unicode.GetString(ms.ToArray());
                }
            }
            return cipherText;
        }
    }

** Im Controller **

referenz für diese Verschlüsselungsklasse hinzufügen:

using testdemo.Models

public ActionResult Index() {
            return View();
        }
        [HttpPost]
        public ActionResult Index(string text)
        {
            if (Request["txtEncrypt"] != null)
            {
                string getEncryptionCode = Request["txtEncrypt"];
                string DecryptCode = Encryption.Decrypt(HttpUtility.UrlDecode(getEncryptionCode));
                ViewBag.GetDecryptCode = DecryptCode;
                return View();
            }
            else {
                string getDecryptCode = Request["txtDecrypt"];
                string EncryptionCode = HttpUtility.UrlEncode(Encryption.Encrypt(getDecryptCode));
                ViewBag.GetEncryptionCode = EncryptionCode;
                return View();
            }

        }

Im Hinblick auf

<h2>Decryption Code</h2>
@using (Html.BeginForm())
{
    <table class="table-bordered table">
        <tr>
            <th>Encryption Code</th>
            <td><input type="text" id="txtEncrypt" name="txtEncrypt" placeholder="Enter Encryption Code" /></td>
        </tr>
        <tr>
            <td colspan="2">
                <span style="color:red">@ViewBag.GetDecryptCode</span>
            </td>
        </tr>
        <tr>
                <td colspan="2">
                    <input type="submit" id="btnEncrypt" name="btnEncrypt"value="Decrypt to Encrypt code" />
                </td>
            </tr>
    </table>
}
    <br />
    <br />
    <br />
    <h2>Encryption Code</h2>
@using (Html.BeginForm())
{
    <table class="table-bordered table">
        <tr>
            <th>Decryption Code</th>
            <td><input type="text" id="txtDecrypt" name="txtDecrypt" placeholder="Enter Decryption Code" /></td>
        </tr>

        <tr>
            <td colspan="2">
                <span style="color:red">@ViewBag.GetEncryptionCode</span>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" id="btnDecryt" name="btnDecryt" value="Encrypt to Decrypt code" />
            </td>
        </tr>
    </table>
}
1
star test

Eine der einfachsten Methoden der Verschlüsselung (wenn Sie sich unbedingt MÜSSEN müssen, da .NET bereits so großartige Verschlüsselungsbibliotheken hat [wie von Cogwheel kurz vor mir bereitgestellt]), ist der Wert XOR der Wert ASCII jedes Zeichen der Eingabezeichenfolge gegen einen bekannten "Schlüssel" -Wert. Die Funktion XOR in C # wird, wie ich glaube, mit der Taste ^ ausgeführt.

Anschließend können Sie die Werte vom Ergebnis der Zeichen XOR in ASCII konvertieren und in der Datenbank speichern. Dies ist nicht sehr sicher, aber eine der einfachsten Verschlüsselungsmethoden.

Bei der Verwendung einer Zugriffsdatenbank habe ich festgestellt, dass einige Zeichen, wenn sie vor einem String stehen, das gesamte Feld beim Öffnen der Datenbank selbst unlesbar machen. Das Feld kann jedoch weiterhin von Ihrer App gelesen werden, auch wenn es für einen böswilligen Benutzer leer ist. Aber wer nutzt den Zugang sowieso schon richtig?

0
Jrud

Verschlüsseln/entschlüsseln Sie keine Passwörter, da dies eine erhebliche Sicherheitslücke darstellt. HASH-Passwörter mit einem starken Hash-Algorithmus wie PBKDF2, bcrypt, scrypts oder Argon.

Wenn der Benutzer sein Kennwort festlegt, wird es gehasht und der Hash (und Salt) gespeichert.

Wenn sich der Benutzer anmeldet, muss das angegebene Kennwort erneut gehasht und mit dem Hash in der Datenbank verglichen werden.

0
Jason Coyne
 string clearText = txtPassword.Text;
        string EncryptionKey = "MAKV2SPBNI99212";
        byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                clearText = Convert.ToBase64String(ms.ToArray());
            }
        }
0
Jeet Poria