web-dev-qa-db-fra.com

Lorsque vous utilisez AES et CBC, le IV peut-il être un hachage du clairexuel?

[À l'origine sur programmeurs.stackers.stackexchange.com avec titre: pouvez-vous chiffrer avec AES + CBC et rechercher les données cryptées ]

Fondamentalement, je vais aller avec une norme de cryptage avancée avec le mode chaînage de chiffrement ou le mode de rétroaction de chiffrement ou le mode de rétroaction de sortie (je n'ai pas encore décidé). Chaque mode nécessite un vecteur d'initialisation. La chose est que je veux faire la chaîne cryptée "interrogeable" comme ceci:

Supposons que j'ai une liste de tables de base de données avec un "nom d'affichage" pour chaque table. Conceptuellement, la liste ressemblerait à ceci (j'ai utilisé {xxx} pour signifier la forme cryptée de xxx et [ivx] pour signifier un vecteur d'initialisation):

ENC_DISPLAY_NAME         | ENC_TABLE_NAME
------------------------ | -----------------
[IV1]{John's table}      | [IV2]{TABLE_3574}
[IV3]{Eric's list}       | [IV4]{TABLE_3100}
                         |
[IV5]{Darren's projects} | [IV6]{TABLE_2823}
[IV7]{Paul's contacts}   | [IV8]{TABLE_5843}

Supposons maintenant que je souhaite permettre une recherche sur ENC_DISPLAY_NAME. (Les recherches sur l'égalité sont toutes nécessaires.) J'ai besoin d'avoir une façon de savoir quel vecteur d'initialisation est utilisé sur le nom d'affichage que je souhaite trouver.

Je pense que je devrais calculer un hachage de 128 bits (peut-être un CRC) du nom d'affichage et l'utiliser comme IV pour calculer la chaîne cryptée. C'est-à-dire que si je veux stocker "Darren's Projets", je devrais faire quelque chose comme ça:

AESKey key = ...;
String str = "Darren's projects";
CRCType crc = ComputeCRC(str);

BinaryString enc = crc.ToBinaryString ( ).Concat
    (EncryptWithAESandCBC(str, key, (IVType)crc));

INSERT INTO MY_TABLE(ENC_DISPLAY_NAME,ENC_TABLE_NAME) VALUES(enc, ...);

Si je veux rechercher la chaîne plutôt, faites les mêmes étapes, à l'exception du dernier, puis de SELECT * FROM MY_TABLE WHERE ENC_DISPLAY_NAME=enc.

Cela a-t-il été essayé avant? Y a-t-il des risques (sécurité)?

[Question connexe: Calculez la clé de cryptage AES étant donné le texte en clair et son chiffontext? ]

15
Null Pointers etc.

Réponse courte: IV doit être aléatoire et envoyé en clair.

Vous devez faire attention à ne pas fuir d'informations sur le texte brut de votre hachage. Il ne doit pas être possible d'arriver au texte brut avec une table arc-en-ciel de votre hachage. Donc, une valeur de sel, stockée dans un fichier de configuration, pas la base de données, est dans l'ordre.

Avec cela dit, je suggère ceci:

  • Utiliser un IV aléatoire, stocké comme vous faites maintenant
  • stocker un hachage salé des données de plainte une autre colonne
  • rechercher le hachage salé à Retreive the Texte aléatoire IV et Cipher

Donc, dans votre exemple, vous auriez ceci:

NC_DISPLAY_NAME                                            | ENC_TABLE_NAME
-----------------------------------------------------------+------------------
hash(salt+"Darren's projects"), [IV5]{Darren's projects}   | [IV6]{TABLE_2823}

Bien sûr, le hachage salé n'est pas sans risque. Il est inférieur à ce que vous avez essayé d'éviter d'éviter, mais toujours présent. Si ce risque est à élevé, vous pouvez chiffrer le texte de texte brut (avec une autre clé AES) en mode ECB et la recherche de cela. Donc, votre table ressemblera à ceci:

NC_DISPLAY_NAME                                               | ENC_TABLE_NAME
--------------------------------------------------------------+------------------
{k1 hash("Darren's projects")}, [IV5]{k2 Darren's projects}   | [IV6]{TABLE_2823}

Faire le hash vous donne l'entropie (blanchiment de l'entrée) équivalente à l'utilisation d'un IV (mais je n'ai pas la puissance de mathématique pour le confirmer). Le cryptage vous donne des tables arc-en-ciel et des dictionnaires d'arc-en-ciel.

Vous savez que vous aurez un compromis de sécurité de vitesse lorsque Brute forçant votre index de recherche prendra plus de temps que la force brute le cipostext crypté aléatoire IV.

5
ixe013

Si vous allez mettre le hachage du contenu juste là, vous réalisez que votre cryptage va simplement vous donner une autre copie des données. Si tout ce que vous utilisez pour est une recherche, tout ce dont vous avez besoin est le hachage (sauf des collisions, de toute façon). Donc, n'importe quel attaquant qui cherche une ligne spécifique basée sur son nom peut le trouver sans connaître la clé en ignorant simplement la partie cryptée des données et à la recherche du hachage de ce qu'il cherche.

Maintenant, si le digestez que vous utilisez est un HMAC, et pas seulement CRC ou un hachage, vous serez peut-être bien. Mais réalisez que vous devez faire attention à ne pas divulguer des informations supplémentaires avec cela.

0
Yuliy