【问题标题】:Token decryption RSA works on localhost but not on server令牌解密 RSA 适用于本地主机但不适用于服务器
【发布时间】:2013-11-26 18:41:49
【问题描述】:

这是我的第一个问题,也是第一篇英文帖子,所以请耐心等待。

我正在开发 ASP.NET MVC Web Api RESTful 应用程序。对于用户身份验证,我想使用加密令牌。 我的想法适用于本地主机: 用户请求令牌地址/令牌,在标头中包括身份验证:昵称:密码,服务器返回加密令牌,用户将在每次下一个请求中使用它。因此,用户发送带有标头 auth-token: encryptedToken 的请求,服务器将解密此令牌并验证用户。在我的本地主机上,一切都很好。 上传到服务器后:(ASP.NET 4.0免费用户) 我要求我的令牌,服务器响应这个令牌(现在一切正常),然后我将发出下一个请求并将我的令牌包含在标头中,服务器尝试解密它并在那里崩溃。 我知道,它在我设置 RSACryptoServiceProvider 他的私钥的部分崩溃(在加密时设置公钥效果很好)。 这是我用于它的 RSAHelper 的代码:

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 encryption/decryption with transmission

How to do role based authorization for asp.net mvc 4 web api

如果有任何帮助,我将不胜感激

编辑// 经过长时间的谷歌搜索,有一些关于类似问题的帖子。对于私钥,我需要完全信任的权限,实际上我有共享服务器。是否有任何现代解决方案可以使其在共享服务器下工作? 帖子:

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

【问题讨论】:

  • 请发布异常详情
  • 不幸的是我无法获取异常详细信息,程序中的其他异常捕获了这个并返回 HTTP/1.1 401 Unauthorized。我将尝试获取此异常详细信息,但我不知道该怎么做:-( PS:我用新的谷歌结果编辑了我的帖子。问题可能出在我的共享服务器权限上吗?
  • 是的,这很可能是原因。很遗憾,您不能在共享环境中使用加密 API。
  • 是的,好像是这样。那么也许还有其他选择如何加密令牌,将其发送给用户,然后将其解密以进行用户身份验证?例如,是否可以在只有一个密钥的情况下使用对称加密?
  • 我建议改用充气城堡:bouncycastle.org/csharp

标签: c# asp.net .net asp.net-mvc rest


【解决方案1】:

所以问题解决了!这是其他有同样问题的人的解决方案:-)

在我的情况下,我的共享服务器的管理员是合理的人,并为我设置了更高的信任级别,所以一切都开始工作了 :-)

对于那些没有这个选项来设置更高信任级别的人,还有另一个非常容易实现的选项: http://www.codeproject.com/Articles/20950/Using-RSA-Public-Key-Encryption-in-a-Shared-Web-Ho 它的工作方式与 RSACryptoServiceProvider 包含相同名称的方法相同。只需将此库添加到您的项目并将 RSACryptoServiceProvider 重命名为 EZRSA :)

【讨论】:

    猜你喜欢
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多