2012-01-08 2 views
1

Je voudrais crypter des chaînes de caractères 1500-2500 en utilisant une clé asymétrique. Il semble que RSA_2048 ne cryptera que jusqu'à 245 caractères.Cryptage asymétrique de chaînes longues

Sur le MSDN Article about EncryptByAsymKey() recommande de «ne pas crypter de grands ensembles de données à l'aide d'une clé asymétrique, mais de chiffrer les données à l'aide d'une clé symétrique forte et de chiffrer la clé symétrique à l'aide d'une clé asymétrique.

Existe-t-il un moyen de le faire sans avoir besoin du mot de passe de la clé asymétrique? ou est-ce que je vais à la mauvaise façon?

Declare @plain varchar(max), @cipher varbinary(max); 
Set @plain = 'Greg'; 

CREATE ASYMMETRIC KEY akey WITH ALGORITHM = RSA_2048 ENCRYPTION BY PASSWORD = '123pass!'; 

CREATE SYMMETRIC KEY skey WITH ALGORITHM = AES_256 ENCRYPTION BY ASYMMETRIC KEY akey; 

OPEN SYMMETRIC KEY skey DECRYPTION BY ASYMMETRIC KEY akey WITH PASSWORD = '123pass!'; 

Set @cipher = ENCRYPTBYKEY(KEY_GUID('skey'), @plain); 

... write @cipher to db ... 

EDIT: Je dois encore être en mesure de déchiffrer les données d'une autre application. Je souhaite que l'application publique sur notre serveur Web crypte les informations de commande client et les écrive dans une base de données. Alors seulement être en mesure de le décrypter en utilisant une autre application fonctionnant sur un serveur physiquement situé dans le bureau.

+0

Quelque chose comme ça? http://www.sswug.org/articles/viewarticle.aspx?id=18250 –

+0

Si vous pouvez déplacer le cryptage/décryptage dans l'application (.NET?) plutôt que de l'exécuter dans la procédure T-SQL, je vous crois aura toute la flexibilité dont vous avez besoin pour résoudre vos problèmes. –

+0

Mais vous voulez être en mesure de les décrypter à partir d'une autre application, non? – CodesInChaos

Répondre

0

Je vais essayer de vous expliquer ce que vous devez faire pour réaliser cela, et laisse la mise en œuvre technique pour l'instant:

Vous devriez normalement créer une persistante (ou semi persistant - garde pour un an) paire de clés une fois dans l'extrémité arrière. La clé privée devrait déjà être dans un endroit sûr à ce moment-là. Ensuite, vous importez une fois la clé publique dans le frontal. Une fois que vous avez reçu les données, vous devez créer des clés de session (par exemple, des clés aléatoires AES-128) pour crypter les données, crypter la session avec la clé publique importée . Chiffrez les données avec la clé de session et essayez d'effacer la clé de la mémoire (essayez de la garder hors de la permutation, ou protégez le fichier d'échange). Stockez les données cryptées et effacez-les de la mémoire aussi bien que possible. Maintenant stocker la clé de session, cryptée avec la clé publique avec les données. Une fois que vous avez besoin des données, vous devez récupérer la clé privée, déchiffrer la clé de session et décrypter les données par la suite. Si vous ne souhaitez conserver que les données confidentielles, il vous suffit de les crypter, par ex. en utilisant AES CBC. Si vous «poussez» les données à déchiffrer par la clé de session, ou si vous voulez également vérifier l'intégrité des données, vous devez également ajouter une protection d'intégrité (par exemple, une autre clé de session pour effectuer un MAC ou un HMAC). avec). La clé privée doit être conservée en sécurité dans le backend, en utilisant éventuellement un mot de passe, une carte à puce, un HSM, une clé USB hors ligne ou même un contrôle d'accès rigoureux, selon vos besoins.

0

Si vous souhaitez chiffrer des données unidirectionnelles, l'approche normale consiste à utiliser un hachage, et non un chiffrement. SQL Server a une fonction HASHBYTES intégrée, documentée ici: http://msdn.microsoft.com/en-us/library/ms174415.aspx. Il prend en charge les champs varbinary jusqu'à 8000 octets. Ceci, ou la suggestion @ Aaron-j-spetner de la fonction PWDENCRYPT, sont les moyens généralement acceptés pour stocker les mots de passe des utilisateurs, car ils deviennent irrécupérables même si la base de données est compromise.

+0

Je m'excuse de ne pas avoir fait cela aussi clair dans ma question. Je dois toujours pouvoir déchiffrer les données (d'une autre application). – Greg

Questions connexes