6

私のアプリケーションにはパスワードフィールドがあります。ユーザーがパスワードを入力すると、そのパスワードを暗号化してデータベースに保存する必要があります。ユーザーがそのアプリケーションにログインすると、パスワードがデータベースから取得され、復号化が行われます。

出来ますか??

4

7 に答える 7

20

あなたは正しい方向にあなたを始めることができるこのリンクを見ることができます。

ただし、暗号化されたバージョンのパスワードではなく、パスワード自体のハッシュ値を保存するのが通常の方法です。ハッシュを使用すると、実際のパスワードを知らなくても、ユーザーが正しいパスワードを入力したかどうかを確認できます(データベースにあるハッシュ値をユーザーが入力したハッシュ値と比較することにより)。

これの利点は、値を暗号化/復号化する必要がないため、通常はより単純で安全なことです。ハッシュを使用することの欠点は、ユーザーにパスワードを送信できないことです(ある種の「パスワードを忘れた」機能を提供することを計画している場合)が、新しいランダムなパスワードにリセットする必要があります。

于 2012-05-22T05:11:58.730 に答える
3

ASP.NET メンバーシップ プロバイダーとロール プロバイダーを使用したくない場合は、次の方法が役立ちます。

    /// <summary>
    /// Decrypts the specified encryption key.
    /// </summary>
    /// <param name="encryptionKey">The encryption key.</param>
    /// <param name="cipherString">The cipher string.</param>
    /// <param name="useHashing">if set to <c>true</c> [use hashing].</param>
    /// <returns>
    ///  The decrypted string based on the key
    /// </returns>
    public static string Decrypt(string encryptionKey, string cipherString, bool useHashing)
    {
        byte[] keyArray;
        //get the byte code of the string

        byte[] toEncryptArray = Convert.FromBase64String(cipherString);

        System.Configuration.AppSettingsReader settingsReader =
                                            new AppSettingsReader();

        if (useHashing)
        {
            //if hashing was used get the hash code with regards to your key
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(encryptionKey));
            //release any resource held by the MD5CryptoServiceProvider

            hashmd5.Clear();
        }
        else
        {
            //if hashing was not implemented get the byte code of the key
            keyArray = UTF8Encoding.UTF8.GetBytes(encryptionKey);
        }

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        //set the secret key for the tripleDES algorithm
        tdes.Key = keyArray;
        //mode of operation. there are other 4 modes.
        //We choose ECB(Electronic code Book)

        tdes.Mode = CipherMode.ECB;
        //padding mode(if any extra byte added)
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(
                             toEncryptArray, 0, toEncryptArray.Length);
        //Release resources held by TripleDes Encryptor
        tdes.Clear();
        //return the Clear decrypted TEXT
        return UTF8Encoding.UTF8.GetString(resultArray);
    }

    /// <summary>
    /// Encrypts the specified to encrypt.
    /// </summary>
    /// <param name="toEncrypt">To encrypt.</param>
    /// <param name="useHashing">if set to <c>true</c> [use hashing].</param>
    /// <returns>
    /// The encrypted string to be stored in the Database
    /// </returns>
    public static string Encrypt(string encryptionKey, string toEncrypt, bool useHashing)
    {
        byte[] keyArray;
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

        System.Configuration.AppSettingsReader settingsReader =
                                            new AppSettingsReader();

        //If hashing use get hashcode regards to your key
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(encryptionKey));
            //Always release the resources and flush data
            // of the Cryptographic service provide. Best Practice

            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(encryptionKey);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        //set the secret key for the tripleDES algorithm
        tdes.Key = keyArray;
        //mode of operation. there are other 4 modes.
        //We choose ECB(Electronic code Book)
        tdes.Mode = CipherMode.ECB;
        //padding mode(if any extra byte added)

        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateEncryptor();
        //transform the specified region of bytes array to resultArray
        byte[] resultArray =
          cTransform.TransformFinalBlock(toEncryptArray, 0,
          toEncryptArray.Length);
        //Release resources held by TripleDes Encryptor
        tdes.Clear();
        //Return the encrypted data into unreadable string format
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

上記の 2 つの方法を使用すると、パスワード文字列をデータベースに保存する際に暗号化し、取得時に復号化することができます。

于 2012-05-24T03:59:36.820 に答える
2

SQL SERVER で SQLCLR UDF を作成できます。パスワードを暗号化された形式で保存するために使用した主な方法は 2 つあります。

Pwdencryp()t はパスワードを暗号化し、暗号化された文字列を返します。これはパスワードを設定するときに使用され、暗号化されたパスワードは master..syslogins テーブルに格納されます。

http://msdn.microsoft.com/en-us/library/dd822791(v=sql.105).aspx

Pwdcompare() はクリア パスワードと暗号化されたパスワードを受け取り、クリア パスワードを暗号化して 2 つを比較することで一致するかどうかをチェックします。パスワードを入力して SQL Server にログインすると、このルーチンが呼び出されます。

http://msdn.microsoft.com/en-us/library/dd822792.aspx

于 2012-05-22T05:41:35.737 に答える
1

ASP.NET SQL Serverメンバーシッププロバイダーは、 ASP.NETパスワードハッシュとパスワードソルトを構成するときにこの機能を提供しますpasswordFormat="Hashed"

しかし、あなたが自分でロールすることを探しているなら、あなたはSaltedPasswordを研究したいと思うでしょう。たとえば、C#のハッシュパスワードとソルトパスワード

于 2012-05-22T05:11:36.953 に答える
1

これを行う簡単な方法は次のとおりです。

string hashedpassword= FormsAuthentication.HashPasswordForStoringInConfigFile("your password", "SHA1");
于 2015-07-03T07:36:29.723 に答える
0

ハッシュパスワードを取得する最も簡単な方法は次のとおりです。 FormsAuthentication.HashPasswordForStoringInConfigFile("value of string", FormsAuthPasswordFormat.MD5.ToString());

于 2012-05-22T06:02:16.650 に答える