Hallo zusammen,
ich habe ein Projekt, das via EntityFramework auf eine Datenbank zugreift. Nun möchte ich die gesamte Datenbank verschlüsseln. Da -so weit ich das bei google verstanden habe- das EntityFramework selbst keine verschlüsselung unterstützt hab eich mir überlegt die Daten eben vorm/nach dem Schreiben in die DB selbst zu verschlüsseln. Dafür würde ich gerne den AES/Rijndael Algorithmus nutzen. Gleichzeitig möchte ich jedoch sicherstellen, dass man das Programm nicht ienfach auf einen anderen Rechner kopieren köntne und dort auf ide Daten zugreifen kann bzw. das Passwort für die Verschlüsselung zB einmal pro Jahr ändern. Deshalb würde ich gern ein Zertifikat hierfür nutzen.
Jetzt habe ich folgenden Ansatz hierfür gewählt:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| public static string encrypt(string text) { X509Certificate2 cert = LoadCert(EnumCipheringTarget.ClientServer); RSACryptoServiceProvider publicprovider = (RSACryptoServiceProvider)cert.PublicKey.Key; byte[] encrypted = publicprovider.Encrypt(GetBytes(text), false); return GetString(encrypted); } public static string decrypt(string text) { X509Certificate2 cert = LoadCert(EnumCipheringTarget.ClientServer); RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey; byte[] decryptedBytes = provider.Decrypt(GetBytes(text), false); return GetString(decryptedBytes); } private static X509Certificate2 LoadCert(EnumCipheringTarget cipherTarget) { X509Store store = new X509Store(StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); X509Certificate2Collection certCollection = store.Certificates; X509Certificate2 cert = null;
string certSubject = ""; switch (cipherTarget) { case EnumCipheringTarget.ServerDB: certSubject = "CN=MY_DB_CERTIFICATE"; break;
default: return null; }
foreach (X509Certificate2 c in certCollection) { if (c.Subject == certSubject) { cert = c; break; } } store.Close(); return cert; } static byte[] GetBytes(string str) { byte[] bytes = new byte[str.Length * sizeof(char)]; System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); return bytes; } static string GetString(byte[] bytes) { char[] chars = new char[bytes.Length / sizeof(char)]; System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); return new string(chars); } |
Das ganze funktioniert auch soweit, dass ich einen Text ver- und später wieder entschlüsseln kann. Der verschlüsselte Text wird jedoch zum eien extrem lang und besteht zum anderen aus einer art chinesische Zeichen? so dass ich ihn nicht in die Datenbank schreiben kann...
Ich denke, dass ich vll bei getBytes/getString etwas falsch mache? Hat jemand eine Idee?
Vielen Dank
Määx
EDIT:
achso, wenn ich andere GetBytes / GetString Methoden wie z.B. System.Text.Encoding.UTF8.GetBytes(str); nutze, bekomme ich immer den Fehler : "Die zu entschlüsselnden Daten überschreiten das Maximum für das Modul um 256Bytes"