0

system.net.mailで使用するメールパスワードを保存する必要があります。これらはプレーンテキストとして取得および送信する必要がありますが、プレーンテキストとして保存したくありません。これは、イントラネットの場合のように実際にはセキュリティに関するものではなく、CMSで結果をプレーンテキストで表示したくないだけです。

パスワードの保存はSHA1を使用して行う必要があるという記事をたくさん読みました。私が読んだことから、プレーンテキストを取得できないため、ハッシュは良くありません。

私は現在この方法を試しています:

public static string EncodePasswordToBase64(string password)
    {
        try
        {
            byte[] encData_byte = new byte[password.Length];
            encData_byte = System.Text.Encoding.UTF8.GetBytes(password);
            string encodedData = Convert.ToBase64String(encData_byte);
            return encodedData;
        }
        catch (Exception ex)
        {
            throw new Exception("Error in base64Encode" + ex.Message);
        }
    } 

public static string DecodeFrom64(string encodedData)
    {
        System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
        System.Text.Decoder utf8Decode = encoder.GetDecoder();
        byte[] todecode_byte = Convert.FromBase64String(encodedData);
        int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
        char[] decoded_char = new char[charCount];
        utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
        string result = new String(decoded_char);
        return result;
    }

しかし、値を格納するための正しいデータ型をデータベースで見つけることができないようです。現在、nvarchar(MAX)に設定されています。

セルの内容は次のように表示されます(各値の間にスペースがあります)。

QXB j LWV w MXB =

不思議なことに、セルをクリックして入力し、データをコピーすると、次のようになります。

Q

この列にはどのデータ型を使用する必要がありますか?

4

2 に答える 2

0

このようなものを使用できます..

//文字列の暗号化用。

public static string Encrypt(string toEncrypt, bool useHashing)
    {
        byte[] keyArray;
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
        string key = "UglyRandomKeyLike-lkj54923c478";
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(key);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateEncryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        tdes.Clear();
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

// 文字列を復号化する

public static string Decrypt(string cipherString, bool useHashing)
    {
        byte[] keyArray;
        byte[] toEncryptArray = Convert.FromBase64String(cipherString);
        string key = "UglyRandomKeyLike-lkj54923c478";
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(key);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        tdes.Clear();
        return UTF8Encoding.UTF8.GetString(resultArray);
    }

上記の方法でパスワードが暗号化され、データベースの varchar フィールドに保存できます。2 番目の方法は、暗号化されたパスワードを受け取り、それを通常の文字列で返します。

于 2013-02-03T07:41:29.613 に答える
0

ええと、ハッシュが正しい方法ではないことは正しいです。実際に使用したいのは対称暗号化です。これにより、DB 内のデータを暗号化できますが、メイン プログラムで復号化することができます。

AES が推奨規格です。C# での使用例を次に示します。

よくある落とし穴を回避するために IV を正しく選択する方法についてもう少し読みたいと思います。

于 2013-02-03T07:28:10.707 に答える