Question

Je voudrais chiffrer des chaînes qui pourraient ne comporter que trois ou quatre caractères mais une vingtaine de caractères. Une fonction de hachage ( md5 , sha1 , crypt , etc.) ne convient pas car je souhaiterais être capable de décrypter l'information aussi bien. L’extension mcrypt offre de nombreuses possibilités.

Quelqu'un at-il des idées sur le meilleur moyen de chiffrer en toute sécurité des chaînes courtes et pourquoi ? Quelqu'un at-il des liens vers des documents présentant un programmeur occasionnel à des scénarios de chiffrement pratiques?

Était-ce utile?

La solution

Je recommande vivement les suggestions de Chris Kite . Sans en savoir plus sur ce que vous faites, pourquoi et sur les menaces que vous prévoyez de devoir protéger contre AES-128, vous aurez probablement une chance suffisante. La possibilité d'utiliser le chiffrement symétrique est idéale pour une application autonome qui sera à la fois le déchiffreur et le chiffreur de données. Comme le disent Chris Kite et Arachnid , il est conseillé de compiler les données et d'utiliser un vecteur d'initialisation aléatoire en raison de la taille réduite de vos données.

  

Mise à jour: En ce qui concerne la raison pour laquelle ... si les données sont suffisamment petites et que le vecteur IV peut être prédit, il est possible de forcer le texte brut en force en générant un texte chiffré pour chaque combinaison. de texte en clair avec le IV connu et en le faisant correspondre au texte chiffré capturé. En bref, voici comment fonctionnent les tables arc-en-ciel.

Maintenant, si vous voulez chiffrer sur un serveur et déchiffrer sur un autre, suivez les suggestions de pdavis . En utilisant une méthode asymétrique, vous pouvez séparer les clés de chiffrement des clés de déchiffrement. Ainsi, si le serveur qui chiffre les données est compromis, l’attaquant ne peut toujours pas déchiffrer les données.

Si vous en êtes capable, cela aiderait la communauté à en savoir plus sur votre cas d'utilisation du chiffrement. Comme je l'ai mentionné ci-dessus, il est essentiel de bien comprendre les menaces plausibles lors de l'évaluation des contrôles de sécurité.

Autres conseils

J'aime utiliser GnuPG pour tout ce qui doit être chiffré sur un serveur, puis éventuellement déchiffré sur le serveur ou sur un autre serveur (ce qui est généralement mon cas). Cela permet un niveau de sécurité supplémentaire puisque dans mon scénario, le serveur de cryptage ne dispose pas de la clé pour décrypter les données. Il permet également un décryptage manuel plus facile. Il existe quelques bons wrappers disponibles pour différentes langues (un autre avantage), l'un pour PHP est Classe PHP GnuPGP .

mcrypt est lié par défaut à la plupart des versions de PHP. Il contient toutes les primitives dont vous aurez probablement besoin. Sans en savoir plus sur ce que vous chiffrez, sur votre modèle de menace, etc., il est difficile de donner des recommandations concrètes sur l'algorithme, le mode de fonctionnement, etc. à utiliser.

Une chose que je peux dire avec certitude: avec de courtes chaînes de texte, il est plus essentiel que jamais que vous DEVEZ utiliser un vecteur d’initialisation aléatoire unique. Sinon, il est facile pour quelqu'un de lancer diverses attaques contre les données cryptées.

Est-il important que quelqu'un puisse le déchiffrer? Si vous essayez simplement de le dissimuler un peu , utilisez ROT13. C'est la vieille école.

Je suis d'accord avec Chris Kite - utilisez simplement AES 128, c'est largement suffisant.

Je ne connais pas exactement votre environnement, mais je suppose que vous transmettez les données en quelque sorte via Internet.

N'utilisez pas la BCE, cela produira toujours le même résultat pour le même texte brut.

Le mode CBC est la voie à suivre et n’oubliez pas un vecteur d’initialisation aléatoire. Ce vecteur doit être communiqué avec le texte chiffré et peut être envoyé en clair.

En ce qui concerne vos données, étant donné qu’AES est un chiffrement par bloc, le résultat est toujours un multiple de la taille du bloc. Si vous ne souhaitez pas que l’observateur sache si vos données sont courtes ou longues, ajoutez des éléments de remplissage pour les étendre jusqu’à la taille maximale attendue.

Si vous souhaitez chiffrer et déchiffrer des données dans une application, vous souhaiterez probablement utiliser un chiffrement à clé symétrique. AES, qui est l'algorithme de chiffrement par bloc symétrique certifié par la NSA pour la sécurisation des données top secrètes, constitue votre meilleur choix. Une implémentation pure PHP est disponible à l'adresse www.phpaes.com

.

Pour votre utilisation, il semble que AES128 est suffisant. Vous voudrez utiliser le mode CBC avec un vecteur d’initialisation aléatoire, sinon les mêmes données produiront toujours le même texte crypté.

Le choix du bon algorithme de chiffrement est une bonne première étape, mais un système sécurisé présente de nombreux facteurs difficiles à maîtriser, tels que la gestion des clés. Il existe de bonnes ressources, telles qu'Applied Cryptography de Bruce Schneier et Security Engineering de Ross Anderson (disponible gratuitement en ligne).

Je suppose que tout algorithme de chiffrement unidirectionnel tel que Blowfish fera l'affaire. Blowfish est rapide et ouvert. Vous pouvez utiliser Blowfish via la fonction crypt (). Autant que je sache, aucun algorithme de chiffrement ne fonctionne particulièrement bien avec les petites chaînes. Une chose à prendre en compte cependant est que forcer brutalement de telles petites ficelles sera très facile. Peut-être devriez-vous chiffrer la chaîne avec une valeur sel 'secrète' pour une sécurité accrue.

Vous pouvez utiliser les idées de programmation générales sans vous fier aux fonctions de cryptage / décryptage intégrées. Exemple de création d'une fonction, appelez-la

function encryptstring($string) {

$string_length=strlen($string);
$encrychars=""; 
/**
*For each character of the given string generate the code
*/
for ($position = 0;$position<$string_length;$position++){        
    $key = (($string_length+$position)+1);
    $key = (255+$key) % 255;
    $get_char_to_be_encrypted = SUBSTR($string, $position, 1);
    $ascii_char = ORD($get_char_to_be_encrypted);
    $xored_char = $ascii_char ^ $key;  //xor operation
    $encrypted_char = CHR($xored_char);
    $encrychars .= $encrypted_char;
} 
/**
*Return the encrypted/decrypted string
*/
return $encrychars;
}

Sur la page avec un lien pour inclure les identifiants à chiffrer

   /**
    *While passing the unique value to a link
    *Do the following steps
    */

    $id=57;//or if you are fetching it automatically just pass it here
     /**
     *For more security multiply some value
     *You can set the multiplication value in config file
     */
     $passstring=$id*346244;
     $encrypted_string=encryptstring($passstring);
     $param=urlencode($encrypted_string);
     /**
     *Derive the url for the link
     */
     echo '<a href="target_file.php?aZ98#9A_KL='.$param.'">something</a>' ;

Sur le fichier cible qui est ouvert après avoir cliqué sur le lien

     /**
      *Retriving the value in the target file
      *Do the following steps
      */
      $fetchid=$_GET['aZ98#9A_KL'];
      $passstring=urldecode(stripslashes($fetchid));
      $decrypted_string= encryptstring($passstring);
      /**
       *Divide the decrypted value with the same value we used for the multiplication
       */
      $actual_id= $decrypted_string/346244;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top