1

RijndaelManagedServicePointManagerに関するセキュリティ上の質問があります。

ユーザー資格情報や一部の XML データなど、C# アプリケーションがデータを暗号化するシステムを実装しました。次に、WebClient を使用して、暗号化されたユーザー資格情報を、指示を含む暗号化された XML ドキュメントと共に Tomcat Java Web アプリケーションに送信します。Java アプリケーションの仕事は、ユーザー資格情報と XML 命令を復号化することです。命令を実行し、暗号化された XML 結果で C# に応答します。

C# アプリケーションから Tomcat サーバーへのすべての接続は、SSL が有効になっています (現時点では自己署名証明書)。

最初の質問: 私の C# アプリケーションは、デフォルトで常に SSL が有効になっているサーバー (のみ) に接続しているという事実を考慮します。コールバック関数を次のように単純に実装できますか:

ServicePointManager.ServerCertificateValidationCallback = デリゲート { true を返します。};

コールバック機能は、接続先のサーバーで使用される証明書を識別して検証するために使用されることを理解しています。そのアプリケーションを (SSL を有効にして) サーバーに接続するクライアントの 1 つに渡すとしたら、上記のコードは満足できるものでしょうか? クライアントが私のアプリケーションを使用して、未知の別のサーバーに接続し、その SSL 証明書の状態についてまったくわからない場合、上記のコードを実際の証明書検証関数に置き換える必要があります。私の質問は理にかなっていますか?

2 番目の質問: 私の C# アプリケーションでは、RijndaelManaged を使用して暗号化/復号化を実装しています。しかし、私が使用しているキーは C# アプリケーションの一部です。アプリケーションは難読化されています。私が理解しているように、これは安全な方法ではありません。

C# アプリケーションが Web アプリケーションから暗号化/復号化キーを受け取るための信頼できる方法はありますか? または、Webアプリケーションでデータを復号化するために使用できるC#アプリケーションでキーを生成する方法はありますか?もしそうなら:そのキーをどのように生成し、最も重要なのは、信頼できる安全な方法でサーバーに送信する方法です.仕方。接続は SSL であるため、キーは単純に暗号化されたストリームの一部である可能性がありますか?

C# アプリで暗号化に使用しているコードを次に示します。

private const string KEY = "samplekey";
private const int KEY_SIZE = 128;
private const int KEY_BITS = 16;
private string Encrypt(string textToEncrypt)
{
    RijndaelManaged rijndaelCipher = new RijndaelManaged();
    rijndaelCipher.Mode = CipherMode.CBC;
    rijndaelCipher.Padding = PaddingMode.PKCS7;

    rijndaelCipher.KeySize = KEY_SIZE;
    rijndaelCipher.BlockSize = KEY_SIZE;


    byte[] pwdBytes = Encoding.UTF8.GetBytes(KEY);
    byte[] keyBytes = new byte[KEY_BITS];

    int len = pwdBytes.Length;
    if (len > keyBytes.Length)
    {
        len = keyBytes.Length;
    }

    Array.Copy(pwdBytes, 0, keyBytes, 0, len);
    rijndaelCipher.Key = keyBytes;
    rijndaelCipher.IV = keyBytes;

    ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
    byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt);

    return System.Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));
}
4

0 に答える 0