Announcement

Collapse
No announcement yet.

Probleme mit RSACryptoServiceProvider

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit RSACryptoServiceProvider

    Hallo,
    ich bin gerade dabei, ein WebPart für eine Sharepoint-Anwendung zu programmieren.
    Problem ist dabei, dass das WebPart einen Verbindungs-String von einem Web-Service beziehen soll. Dabei soll das WebPart dem Web-Service einen öffentlichen RSA-Schlüssel übergeben und erhält dann den verschlüsselten Connection-String zurück.
    Für diesen Zweck wird im WebPart ein RSACryptoServiceProvider erstellt, der dann seine Parameter ausliest und dem WebService übergibt (ursprünglich auch mal mit der toXMLString-Methode versucht). Im Web-Service wird dann mit den Parametern ein neues RSACRyptoServiceProvider erstellt, verschlüsselt und zurückgeschickt und im WebPart entschlüsselt.
    Soweit, so gut, das klappt auch. Aber plötzlich kommt später immer eine CryptographicException, die mir sagt: "Der Schlüsselsatz ist nicht vorhanden". Dabei wird weder gesagt, in welcher Zeile, noch welches Objekt es ausgelöst hat. Hat so was jemand mal gesehen oder weiß etwas? Hier noch mal ein bisschen Code dazu:

    WebPart-Methode zum Verschlüsseln:
    Code:
                
    WebService.SharePointWebPart webService = new WebService.Service();
                webService.Url = this.getAppSetting("WebPartGridNew.APWebServices.SharePointWebPart");
                RSACryptoServiceProvider prov = new  System.Security.Cryptography.RSACryptoServiceProvider();
                RSAParameters para = prov.ExportParameters(false);
                webService.UseDefaultCredentials = true;
                //para.
                webService.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12;
                byte[] conn = null;
                try
                {
                    //etwas seltsame Parameterübergabe, der Webservice weigert sich aber, structs anständig anzunehmen, also dieser Behelf
                    conn = webService.getString(info.table, para.D, para.DP, para.DQ, para.Exponent, para.InverseQ, para.Modulus, para.P, para.Q);
                }
                catch (Exception e)
                {
                    System.Console.Write(e.Message);
                }
                string connFertig=(System.Text.Encoding.Default.GetString(prov.Decrypt(conn,false)));
                prov = null;
                para.D = null;
                para.DP = null;
                para.DQ = null;
                para.Exponent = null;
                para.InverseQ = null;
                para.Modulus = null;
                para.P = null;
                para.Q = null;
                return connFertig;

    Web-Servcice - Methode
    Code:
            [WebMethod]
            public byte[] getString(string table, byte[] D, byte[] DP, byte[] DQ,byte[] Exponent, byte[] InverseQ, byte[] Modulus, byte[] P, byte[] Q)
            {
                byte[] objResult=null;
                string ConnectionString = "data source=jgreivingmobil;initial catalog=P2PlusDemo;user id=sa;password=xxl23456;Connect Timeout=60";
                RSACryptoServiceProvider rsaCryptoServiceProvider;
                RSAParameters para;
                try
                {
                    rsaCryptoServiceProvider = new RSACryptoServiceProvider();
                    para = new RSAParameters();
                    para.D = D;
                    para.DP = DP;
                    para.DQ = DQ;
                    para.Exponent = Exponent;
                    para.InverseQ = InverseQ;
                    para.Modulus = Modulus;
                    para.P = P;
                    para.Q = Q;
                    rsaCryptoServiceProvider.ImportParameters(para);
                    objResult = rsaCryptoServiceProvider.Encrypt(System.Text.Encoding.Default.GetBytes(ConnectionString), false);
                    rsaCryptoServiceProvider = null;
                    para.D = null;
                    para.DP = null;
                    para.DQ = null;
                    para.Exponent = null;
                    para.InverseQ = null;
                    para.Modulus = null;
                    para.P = null;
                    para.Q = null;
                    rsaCryptoServiceProvider.to
                    return objResult; 
                }
                catch (Exception e)
                {
                    System.Console.Write(e.Message);
                }
                return null;
    }

  • #2
    Okay, scheint sich behoben zu haben. Sehr seltsam.

    Comment


    • #3
      Hallo,

      damit der Workerprozess von ASP.NET auf den eigenen RSA-Schlüsselcontainer zugreifen kann, muss das verwendete Benutzerkonto der ACL (Access Control List) hinzugefügt werden. Im Fall von Windows XP (Entwicklungsrechner) verwendet ASP.NET das Benutzerkonto ASPNET:

      Code:
      C:\Temp\Web>aspnet_regiis -pa "CustomKeys" "P4XP3GHZ\ASPNET"
      Adding ACL for access to the RSA Key container...
      Succeeded!
      Im Fall der späteren Installation auf dem Windows 2003 Server verwendet ASP.NET in der Default-Konfiguration das Benutzerkonto NT Authority\NetworkService.

      Comment


      • #4
        Ah, okay. Danke, danke. Hm, hab inzwischen auch gefunden, wie man das Schreiben unterbinden kann:
        Code:
                        RSACryptoServiceProvider.UseMachineKeyStore = true;
                        RSACryptoServiceProvider prov = new System.Security.Cryptography.RSACryptoServiceProvider();
                        prov.FromXmlString(this.Key);
                        verbindung = (System.Text.Encoding.Default.GetString(prov.Decrypt(this.Connectionstring, false)));
                        prov.PersistKeyInCsp = false;
                        prov.Clear();
                        prov = null;
        Entscheident ist dabei die Zeile

        Code:
        prov.PersistKeyInCsp = false;
        Diese sollte das Schreiben unterbinden, somit benötigt man keine Extrarechte mehr. Zumindest hab ich mir das so zusammengereimt.
        Zuletzt editiert von Mel_one; 16.05.2007, 17:03.

        Comment

        Working...
        X