2009-11-06 2 views
1

J'ai été bloqué en essayant d'arriver à une meilleure solution pour cela pendant un moment. Je sais qu'un vecteur d'initialisation doit être unique pour chaque élément étant crypté. Donc, si je crypte une adresse et que je la stocke dans un seul champ, j'ai besoin d'un seul iv pour cela. Mais si j'ai l'adresse répartie sur plusieurs champs, j'ai besoin de plusieurs ivs, un pour chaque champ. C'est un problème.Cryptage: comment avoir 1 iv en dépit de plusieurs champs

Existe-t-il un moyen pour crypter plusieurs champs (tous dans la même ligne/enregistrement) avec un seul iv, tout en conservant l'individualité des champs? Le but est d'avoir un seul iv par enregistrement.

Ce que je pensais à faire était quelque chose comme ça

//get input for fields 1-5 

//encrypt them, so that each one has its iv appended to it 
$field1_enc = encr($field1); 
$field2_enc = encr($field2); 
$field3_enc = encr($field3); 
$field4_enc = encr($field4); 
$field5_enc = encr($field5); 

//then store them individually in the database 

Comment puis-je Crypter tous les champs avec une seule clé? Alors que se passe-t-il lorsque je veux modifier l'un de ces champs? (Je suppose que je devrais écraser, puis re-crypter avec un nouveau iv). Mais la question principale est en dehors du concept, je ne comprends pas comment faire cela par programme, c'est-à-dire crypter tous les champs avec un seul iv

Répondre

4

IV doit être unique mais ne doit pas être imprévisible ou secret. Pourquoi ne créez-vous pas un nombre aléatoire comme base de IV pour chaque enregistrement. Ajoutant 1 à la base et l'utiliser comme IV pour le champ 1, en ajoutant 2 pour le champ 2 ...

EDIT: Voici quelques détails de mise en œuvre,

Créer une colonne pour iv_base, ce qui est tout simplement un nombre aléatoire ,

$ iv_base = random();

Lorsque vous encryt ou décrypter les champs, utilisez cette fonction pour créer IV,

function get_iv($base, $size, $seq) { 
    $remaining = $size; 
    $round = 0; 
    $iv = ''; 
    while ($remaining != 0) { 
     $d = md5($base . $seq . $round, true); 
     $len = min($remaining, 16); 
     $iv .= substr($d, 0, $len); 
     $remaining -= $len; 
     $round++; 
    } 
    return $iv; 
} 

$ base est le nombre aléatoire que vous avez enregistré dans la base de données. La taille $ est la taille IV. $ seq est le numéro que vous avez attribué pour chaque champ. Vous pouvez également utiliser le nom du champ.

+0

Bon point. Mais que voulez-vous dire en ajoutant 1, 2, 3, etc.? L'iv généré est une chaîne encodée en base64. Il a été initialement généré à partir de MCRYPT_DEV_RANDOM, puis passé à 'mcrypt_enc_get_iv_size' pour obtenir la bonne taille pour ce chiffrement, puis passé à' mcrypt_create_iv', puis le codage base64 qui a donné quelque chose comme ceci 'Vi6emRmemexY =' Donc si je considère que ma base, comment je suis supposé ** ajouter ** 1,2,3, etc. Je suppose que vous ne voulez pas dire une simple concaténation, car cela ne produira pas un 'mcrypt_enc_get_iv_size 'correspondant lorsqu'il sera décodé. S'il vous plaît clarifier :) – Chris

+0

Voir mes modifications ........................ –

+0

Je l'ai vu maintenant, va essayer et revenir – Chris

Questions connexes