3

これは私の最初の質問であり、英語での最初の投稿ですので、しばらくお待ちください。

ASP.NET MVC Web Api RESTful アプリケーションに取り組んでいます。ユーザー認証には、暗号化されたトークンを使用したいと考えています。localhost で機能する私の考え: ユーザーはトークン アドレス/トークンを要求し、ヘッダーには auth: Nickname:passwd が含まれ、サーバーはユーザーが次のすべての要求で使用する暗号化されたトークンを返します。したがって、ユーザーはヘッダー auth-token: encryptedToken を含むリクエストを送信し、サーバーはこのトークンを復号化してユーザーを認証します。私のローカルホストでは、すべてがうまく機能します。サーバーにアップロードした後: (無料ユーザーの場合は ASP.NET 4.0) トークンを要求し、このトークンを使用してサーバーに応答します (すべて問題ありません)。次の要求を行い、トークンをヘッダーに含めます。サーバーは復号化を試みます。それとそこでクラッシュします。私は、RSACryptoServiceProvider に秘密鍵を設定した部分でクラッシュすることを知っています (暗号化に公開鍵を設定するとうまくいきます)。

public class RSAHelper
{
    private static string _privateKey = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<RSAParameters xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n  <Exponent>AQAB</Exponent>\r\n  <Modulus>rrEAoxIBFkfvoLr8vvT2Z3CKHKtpXiAPIYKbgtiP/B8YAOhDo1W3dD4MKX05eXn0jFifXBoy2WbGTacE88NocXoSUWVH4a7d3Bm4hfeNawfSSHEpkO0xryU6xF0PdfqO+Vc6y9gajYugUkAdougqaall4TwjsfZ/XUVl6GkTOws=</Modulus>\r\n  <P>zDkpvahctB77Hx/4W1Yfp5rCC3B7rL9CHvf+L1rQdEgooK2NI4Nz6uTixgTTmyRSLRdGLIZRAjAUVFNdYaIbCw==</P>\r\n  <Q>2vsc41/NtLKoCwUtuXyvx4o0c3/RNVLws3VpQ2Ct+2kHt15siO9IwCTTQPgbUi52e8cbh7w3wwWoLwsugAdgAQ==</Q>\r\n  <DP>DcOYhZjQTq9721grQ/SlA4XRqDW3kCf/y9iJACYNwJiQbGvmBEu6x00P36q5nE4xX6qe5ydSVGRrKlfIBmmHiw==</DP>\r\n  <DQ>uhlOo613lGmAhl0QTuK4QEwj50Ro93hVNy5BFxHCyjaoaB3G/1jb6u9g2YYBMgZqiybbLq+2c/cKx3ApRIUAAQ==</DQ>\r\n  <InverseQ>H0BA/DVxNa/JukiqHYe+xuYtblCL04o7pCoAvx/5BFBqHAFOP8Vg0R16WNNoABUGDRTYe7AkWUAquqW9uVWaLw==</InverseQ>\r\n  <D>LGyCtvVrJVlhzMQAZicxShjKZoQIpZENh/4IwfuEkh7uIbzvBmhT4NGukhZwOT4UPGSFEgzvhW2nXDPvBHZa5qT/JknF0juT/B6goa+suMjYupAYk/8oIJuF8ez9MWQ1Blouc+/6Gxoh8tRsRpixoRXbX0kUrz8DdEgjSxp8gAE=</D>\r\n</RSAParameters>";
    private static string _publicKey = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<RSAParameters xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n  <Exponent>AQAB</Exponent>\r\n  <Modulus>rrEAoxIBFkfvoLr8vvT2Z3CKHKtpXiAPIYKbgtiP/B8YAOhDo1W3dD4MKX05eXn0jFifXBoy2WbGTacE88NocXoSUWVH4a7d3Bm4hfeNawfSSHEpkO0xryU6xF0PdfqO+Vc6y9gajYugUkAdougqaall4TwjsfZ/XUVl6GkTOws=</Modulus>\r\n</RSAParameters>";
    private static UnicodeEncoding _encoder = new UnicodeEncoding();

    public static string Decrypt(string data)
    {
        try
        {
            var bytesCypherText = Convert.FromBase64String(data);

            //rsa.FromXmlString(_privateKey);
            //get a stream from the string
            var sr = new System.IO.StringReader(_privateKey);
            //we need a deserializer
            var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
            //get the object back from the stream
            var privKey = (RSAParameters)xs.Deserialize(sr);
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa.ImportParameters(privKey); //-------- here is the problem 
            var bytesPlainTextData = rsa.Decrypt(bytesCypherText, false);

            //get our original plainText back...
            var plainTextData = System.Text.Encoding.Unicode.GetString(bytesPlainTextData);
            return plainTextData;
        }
        catch (Exception)
        {
            throw new RSAException(); 
        }
    }

    public static string Encrypt(string data)
    {
        try
        {
            var rsa = new RSACryptoServiceProvider();
            //rsa.FromXmlString(_publicKey);
            //get a stream from the string
            var sr = new System.IO.StringReader(_publicKey);
            //we need a deserializer
            var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
            //get the object back from the stream
            var pubKey = (RSAParameters)xs.Deserialize(sr);
            rsa.ImportParameters(pubKey);
            var dataToEncrypt = System.Text.Encoding.Unicode.GetBytes(data);
            var bytesCypherText = rsa.Encrypt(dataToEncrypt, false);
            return Convert.ToBase64String(bytesCypherText);

        }
        catch (Exception ex)
        {
            throw new RSAException();
        }
    }

    public class RSAException : Exception
    {
        public RSAException() : base("RSA Encryption Error") { }
    }
}

少し混乱して申し訳ありませんが、私は自分の問題を解決しようとしており、非常に必死です。2日経ってもまったく進歩がありませんが、同じ場所で同じ問題が発生しています!

私は 3 つのチュートリアルまたはヒントを試していました: http://msdn.microsoft.com/cs-cz/library/system.security.cryptography.rsacryptoserviceprovider(v=vs.110).aspx

送信による C# RSA 暗号化/復号化

asp.net mvc 4 web api のロールベースの承認を行う方法

どんな助けにもとても感謝します

EDIT //長いグーグルの後、同様の問題に関するいくつかの投稿があります。秘密鍵の場合、完全な信頼のアクセス許可が必要で、実際にはサーバーを共有しています。共有サーバーで動作させるための最新のソリューションはありますか? に関する投稿:

http://www.codeproject.com/Articles/20950/Using-RSA-Public-Key-Encryption-in-a-Shared-Web-Ho
and
http://forums.asp.net/t/983896.aspx
4

1 に答える 1

3

それで問題は解決しました!そして、ここに同じ問題を抱えている他の人のための解決策があります:-)

私の場合、共有サーバーの管理者は合理的な人であり、より高い信頼レベルを設定しているため、すべてが機能し始めます:-)

より高い信頼レベルを設定するこのオプションを持っていない人のために、実装が非常に簡単な別のオプションがあります: http://www.codeproject.com/Articles/20950/Using-RSA-Public-Key-Encryption-in-a -Shared-Web-Ho 同名のメソッドを含む RSACryptoServiceProvider と同じように動作します。このライブラリをプロジェクトに追加し、RSACryptoServiceProvider の名前を EZRSA に変更するだけです :)

于 2013-11-14T19:23:39.290 に答える