La recherche dans des colonnes chiffrées sans les déchiffrer est rendue possible grâce à un "blind index". Contrairement à un chiffrement classique non déterministe qui génère un nouveau texte chiffré pour chaque même donnée, le blind index utilise une fonction cryptographique déterministe et secrète (comme HMAC-SHA256) sur la donnée normalisée. Ce mécanisme permet de créer un index sur cette valeur générée, autorisant ainsi les requêtes d'égalité.
L'implémentation dans Symfony/Doctrine consiste à ajouter une colonne supplémentaire à la base de données pour stocker ce blind index, aux côtés du champ chiffré. Lors d'une recherche, le système interroge d'abord la colonne du blind index. Comme la fonction de hachage est déterministe, la même valeur en clair produira toujours le même index. Cependant, en raison de la troncature délibérée de cet index, des collisions sont possibles.
Pour pallier ces collisions et garantir l'exactitude, une étape de vérification est indispensable après avoir récupéré les candidats via le blind index. Le système déchiffre alors le contenu réel de la colonne chiffrée pour les enregistrements correspondants et le compare à la valeur recherchée. Cette approche permet de maintenir la confidentialité tout en autorisant des requêtes efficaces sur les données sensibles.
L’article explique comment détecter des pages web similaires, même si leur contenu n’est pas strictement identique, en utilisant l’algorithme SimHash. Contrairement aux fonctions de hachage classiques comme MD5, qui produisent des empreintes radicalement différentes dès qu’un caractère change, SimHash génère des signatures numériques proches pour des contenus proches. Cela permet de repérer des doublons partiels, comme des fiches produits identiques avec une seule ville modifiée.
L’auteur détaille le fonctionnement de SimHash, inspiré d’une méthode publiée en 2002 et popularisée par Google en 2007 pour dédupliquer des milliards de pages. L’algorithme repose sur une "élection" de 64 questions binaires, où chaque mot du texte "vote" en fonction de son propre hachage. Le résultat final est une empreinte de 64 bits reflétant la similarité globale du contenu.
Enfin, l’article propose une implémentation en PHP sans dépendances, adaptée à des comparaisons en base de données pour des millions de pages. Cette approche évite le recours coûteux à des modèles de langage (LLM) tout en restant efficace pour des cas comme le crawler de redirection.io.
Tout est dans le titre
Tout est dans le titre