J'ai besoin d'encoder/chiffrer des identifiants de base de données et de les ajouter à mes URL. La sécurité n'est pas un problème que je cherche à résoudre, mais je cherche quelque chose avec une sécurité modérée. Le but principal est d'avoir des identifiants courts, uniques et sûrs pour les URL.
L'extrait suivant semble faire ce dont j'ai besoin (à partir de http://programanddesign.com/php/base62-encode/)
function encode($val, $base=62, $chars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
// ne peut pas gérer les nombres plus grands que 2^31-1 = 2147483647
$str = '';
do {
$i = $val % $base;
$str = $chars[$i] . $str;
$val = ($val - $i) / $base;
} while($val > 0);
return $str;
}
function decode($str, $base=62, $chars='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') {
$len = strlen($str);
$val = 0;
$arr = array_flip(str_split($chars));
for($i = 0; $i < $len; ++$i) {
$val += $arr[$str[$i]] * pow($base, $len-$i-1);
}
return $val;
}
echo encode(2147483647); // affiche 2lkCB1
Je vais probablement modifier un peu les fonctions :
- Supprimer le paramètre $base ; cela peut être déterminé par la longueur de ($chars)
- Éliminer dans l'ensemble de caractères les lettres/chiffres qui pourraient être confondus entre eux (par exemple, 0, O, o)
Comment pourrais-je modifier le script pour utiliser un sel avec ? Et serait-ce une bonne idée ? Est-ce que j'augmenterais involontairement les chances de collision, etc. ?