Des colonnes chiffrées avec Entity Framework
Quelqu'un a trouvé le bon moyen de tirer des valeurs chiffrées de la db via entity framework 4?
J'ai une base MySql avec certaines colonnes chiffrées avec des_encrypt et doivent être en mesure d'obtenir les valeurs aussi facile que possible, et aussi, bien sûr, mettre à jour et de les insérer.
Je pense que c'est assez étrange, il ne semble pas être dans un support intégré pour cet EF. Même notre propre ORM-système de support pour cela. Nous venons d'ajouter un commentaire "crypté" pour chaque champ de c'est crypté et l'outil ORM va ajouter des_decrypt(colonne) et des_encrypt(colonne) dans les requêtes.
Quelqu'un?
OriginalL'auteur Andreas | 2010-07-21
Vous devez vous connecter pour publier un commentaire.
De l'OMI, vous devez chiffrer avant de les mettre dans la base de données et de les stocker sous forme de données binaires. Ensuite, vous pouvez facilement obtenir le
byte[]
avec EF.EDIT: Ce que si vous avez utilisé une procédure stockée pour faire toutes les
des_encrypt
etdes_decrypt
ainsi que laselects/inserts/deletes
pour vous. Puis EF vais quand même faire le mapping pour vous?Voir mon montage ci-dessus.
Merci pour la suggestion. Cela ressemblait vraiment une bonne idée et je l'ai essayé. malheureusement, si je veux être en mesure de faire des requêtes LINQ sur l'ensemble de mes données décryptées à partir de la table, la procédure stockée doit d'abord exécuter. Cela prend une éternité puisque c'est de 250 000+ lignes avec 5 colonnes de chaque être décrypté. Donc faire: contexte.Tous lesmembres().Où(x=>x.MemberId == 1) va prendre trop de temps. Sûr que je pourrais faire un SP qui prend un argument de memberid, mais que si je veux de la recherche sur, par exemple, firstname avec LINQ? Peut-être im manquer quelque chose d'important ici...
Ce que je comprends ...
MemberId
est crypté? Ne devriez-vous pas seulement besoin de décrypter les colonnes qui sont chiffrés (comme un mot de passe... même si vous devez utiliser un hachage à sens unique)? SiMemberId
est pas crypté, vous n'avez pas besoin de le décrypter pour faire un 'SELECT'. Est ce que quelqu'un d'autre à l'aide de ce tableau? Pourquoi ne pas vous décrypter tous et de créer une nouvelle table pour les données non cryptées?Non, tout MAIS le memberid est crypté (c'est la clé primaire). Nous décrypter des choses comme le numéro de sécurité sociale, les noms et adresses parce que c'est des données sensibles pour nous. Le mot de passe est hashé, donc pas de problème là. Ce tableau est utilisé beaucoup, mais nous ne voulons pas vraiment une autre version de ce qui est décrypté depuis qui allait très thea idée d'avoir les choses chiffré. Désolé pour ma réponse tardive, vacances... 🙂
OriginalL'auteur TheCloudlessSky
C'est un exemple de mise en œuvre de la réponse proposée par @TheCloudlessSky. Je pensais que ça va aider quelqu'un qui se demandait comment la mettre en œuvre.
Je travaille avec une base de données existante, de sorte que le modèle de base de la classe a été généré automatiquement pour moi.
Auto-généré l'Utilisateur.cs:
J'ai créé mon propre Utilisateur.cs. (Remarque: il est dans le même espace de noms que la génération automatique de l'Utilisateur.cs et il n'y avait pas d'erreurs du compilateur parce que la génération automatique de l'Utilisateur.cs a été déclarée comme classe partielle! Aussi, mon propre Utilisateur.cs ne peut pas être dans le même dossier que l'auto-généré l'Utilisateur.cs en raison de conflit de nom de fichier!)
Maintenant, chaque fois que je devais récupérer de l'Utilisateur à partir de mon DbContext, je vais voir toutes les propriétés définies dans la classe auto-générée ainsi que celles définies dans mon améliorée de la classe.
Ici est une application de mes UserRepository.cs:
Maintenant, vous demandez peut-être comment/où ai-je MyDbContext.Decrypt ()?
Ce n'est PAS généré automatiquement pour vous. Toutefois, vous pouvez importer cette procédure stockée dans votre auto-Modèle généré.Contexte.cs fichier. (Ce processus est très bien documenté dans l'officiel EntityFramework l'article: Comment faire: Importer une Procédure Stockée (Modèle de Données d'Entité Outils) à http://msdn.microsoft.com/en-us/library/vstudio/bb896231(v=vs. 100).aspx)
Juste au cas où vous ne savez pas quel résultat final devrait ressembler, voici ce qui a été généré automatiquement à partir de mon Modèle.Contexte.cs:
C'est comment mon Décrypter Procédure Stockée ressemble:
Facteurs De Performance
Maintenant que je vous ai montré une mise en œuvre de la réponse donnée par @TheCloudlessSky, je tiens à mettre rapidement en évidence certaines liées à la performance de points.
1) Chaque fois que vous récupérez un objet utilisateur, il y a 2 voyages à la base de données au lieu de 1. Premier voyage pour retrouver un objet; deuxième voyage de décryptage du SSN. Cela peut provoquer des problèmes de performances si vous n'êtes pas prudent.
Recommandation: Ne PAS auto déchiffrer les champs! Dans mon exemple ci-dessus, j'ai déchiffré le SSN lorsque j'ai été la récupération de l'utilisateur de l'objet. Je n'ai qu'a des fins de démonstration uniquement! Demandez-vous si vous avez vraiment besoin de SSN, à chaque fois que l'Utilisateur est récupéré. Si possible, choisissez paresseux déchiffrement plus désireux de décryptage!
2) Alors que je n'ai pas fait la démonstration, à chaque fois que vous créer/mettre à jour un objet utilisateur, il y aura aussi 2 voyages à la base de données. Premier voyage pour le chiffrage du SSN; deuxième voyage pour l'insertion de l'objet. Là encore, cela peut provoquer des problèmes de performances si vous n'êtes pas prudent.
Recommandation: Être conscient de ce gain de performance, mais ne pas déléguer le chiffrement et l'enregistrement des SSN comme une méthode différente. Tout garder à l'intérieur d'une seule opération, sinon vous risquez d'oublier de sauvegarder complètement. Donc, la recommandation pour la création et la mise à jour est à l'opposé de récupération: choisissez désireux de chiffrement plus paresseux de cryptage de!
Je suis d'accord avec vous sur les performances associées à de multiples voyages à la base de données. En général, la rédaction dédiée des procédures stockées pour la CUD opérations et de les relier au modèle via entity framework est plus efficace que d'avoir des procédures stockées comme crypter/décrypter. Mais je voulais démontrer une méthode de réalisation de chiffrement/déchiffrement à l'aide des touches géré par la base de données au lieu de l'application.
Je suis en fournissant un lien pour comment connecter CUD procédures stockées de la CUD à l'exploitation par le cadre de l'entité dans le cas où quelqu'un est curieux sur la façon de réaliser ceci: msdn.microsoft.com/en-us/data/jj593489. Je sais que les liens sont généralement mal vues, mais puisque celui-ci est à la MSDN Entity Framework Documentation du site, j'espère que les gens ne les dérange pas.
Excelent informatif utile détaillées et utiles, y compris les liens dans la réponse et commentaire! Merci beaucoup!
OriginalL'auteur Parth Shah
Vous pouvez utiliser le Chiffrement AES (2 façon de chiffrement). Lorsque vous avez besoin d'interroger la db, vous pouvez envoyer la chaîne cryptée qui peut représenter la valeur cible.
Vous pouvez créer une Extension pour Décrypter l'Entité.
Cela peut faire une requête de base de données.
Être conscient de la taille des données, de données chiffrées est plus grande...
OriginalL'auteur EliorCohen
Pour ceux d'entre vous Googler cette question et à la recherche d'un moyen simple de déchiffrer une seule colonne/ligne (pas un ensemble table/classe), à l'aide d'un chiffrement symétrique et EF, vous pouvez le faire de deux (simple) des moyens.
Première manière; créer une procédure stockée qui n'votre décryptage:
... puis appelez la procédure stockée directement dans le code, récupérer le résultat sous forme de chaîne:
La deuxième façon, vous pouvez le faire est par l'intermédiaire d'une transaction de base de données qui fait essentiellement la même chose que la procédure stockée. Remarque je suis pleinement conscient que cet exemple n'est pas sql injection conforme à la protection des, j'ai eu quelques problèmes avec des requêtes paramétrées c'était donc l'exemple que j'ai obtenu de travail. Vous souhaitez utiliser des requêtes paramétrées si vous aller dans cette voie;
OriginalL'auteur n00b
Vous pourriez aller le BRICOLAGE/roll-votre propre cryptage de sécurité, mais tous les experts de la sécurité vais vous dire de jamais, au grand jamais, que. La partie la plus difficile de la sécurité des données et le chiffrement n'est pas réellement "AES" ou d'un algorithme. Il est la clé de la gestion. Tôt ou tard, vous ferez face à cette bête et c'est façon plus difficile.
Heureusement, il existe un outil appelé Crypteron CipherDb qui prend soin de cela. En fait, il va au-delà de l'entité cadre de chiffrement, fournissant également automatique de la protection antialtération, clé sécurisée de stockage, sécurisé de distribution de clés, clés roll-overs, la mise en cache de clés, listes de contrôle d'accès et plus. Il y a un gratuite community edition et il ne faut que quelques minutes pour ajouter à votre application.
Lors de l'intégration avec Entity Framework, vous venez d'annoter le modèle de données avec
[Secure]
ou le nom d'une propriété à quelque chose commeSecure_SocialSecurityNumber
(leSecure_
est la clé de la partie) et CipherDb prend en charge le reste.Par exemple, votre modèle de données serait:
Et votre site web.config serait
Il est recommandé pour sécuriser votre site web.config OU brancher le Crypteron clé API (AppSecret) par programmation (la documentation)
Vous pouvez trouver des exemples d'applications sur GitHub à https://github.com/crypteron/crypteron-sample-apps. .
En passant, la version gratuite avantages de l'offre commerciale, donc, en plus de ce qui précède, vous pouvez également sécuriser les flux, des fichiers, des objets, des files d'attente de messages, les bases de données NoSQL, etc, le tout à partir d'un seul endroit.
Avertissement: j'y travaille et nous avons une communauté free edition qui n'importe qui peut utiliser (et nous ne faisons pas de l'argent). Si vous pensez que c'est cool, dites-nous, dites le à vos amis. Si vous avez un budget, obtenir une licence commerciale. Il nous aide à offrir à l'édition gratuite pour tout le monde 🙂
OriginalL'auteur DeepSpace101
Dans mon cas précis j'avais besoin de crypter le numéro de carte de crédit, qui est toujours de 16 caractères; donc j'ai juste ajouté une condition à l'obtenir (si les longueur != 16 ensuite déchiffrer) et dans l'ensemble (si longueur == 16 alors chiffrer) de la propriété. Il fonctionne et éviter de moi beaucoup de travail.
OriginalL'auteur Carlos