2010-11-08 5 views
2

Fondamentalement, je suis à la recherche d'une fonction pour effectuer les opérations suivantesComment générer une chaîne longue de 128 bits?

generateToken(128) 

qui retournera un 128 bits chaîne composée d'entiers ou des caractères de l'alphabet.

Clarification: Des commentaires, j'ai dû changer la question. Apparemment, je cherche une chaîne de 16 caractères si elle doit être de 128 bits.

+0

ce qui est d'avoir 128 bits? le numéro de la représentation de la chaîne? – Artefacto

+0

La longueur des bits – axsuul

+0

Axsuul, votre réponse n'a aucun sens. – Artefacto

Répondre

3

Y a-t-il une raison pour laquelle vous devez limiter la chaîne à des entiers? Cela rend le problème beaucoup plus difficile car chaque chiffre vous donne 3.3 bits (parce que 2^3.3 ~ = 10). Il est difficile de générer exactement 128 bits de jeton de cette manière.

Il est beaucoup plus facile d'autoriser le codage hexadécimal (4 bits par caractère). Vous pouvez ensuite générer 128 bits aléatoires authentiques, puis les encoder en hexadécimal pour une utilisation dans votre application. Le codage Base64 (6 bits par caractère) est également utile pour ce genre de chose.

openssl_random_pseudo_bytes vous donnera une chaîne d'octets aléatoires que vous pouvez utiliser bin2hex pour encoder, sinon vous pouvez utiliser mt_rand dans votre propre routine de génération de jeton.

EDIT: Après avoir lu les mises à jour de la question, il semble que vous vouliez générer un jeton qui représente 128 bits de données et que la longueur réelle de la chaîne (en caractères) n'est pas si importante. Si je devine votre intention correctement (que c'est un ID unique, éventuellement à des fins d'identification/authentification) alors je vous suggère d'utiliser openssl_random_pseudo_bytes pour générer le bon nombre de bits pour votre problème, dans ce cas 128 (16 octets). Vous pouvez ensuite encoder ces bits comme bon vous semble: hex et base64 sont deux possibilités. Notez que le codage hexadécimal utilise 32 caractères pour coder 128 bits de données puisque chaque caractère code seulement 4 bits (128/4 = 32). Base64 utilisera 22 caractères (128/6 = 21.3). Chaque caractère occupe 8 bits de stockage mais code seulement 4 ou 6 bits de information.

Veillez à ne pas confondre la longueur de chaîne encodée avec la longueur de données brutes. Si vous choisissez une chaîne de 16 caractères en utilisant des caractères alphanumériques (az, AZ, 0-9), vous obtenez seulement 6 bits d'information par caractère (la base de données 2 sur 62 est proche de 6), donc votre chaîne de 16 caractères encodera seulement 96 bits d'information. Vous devriez penser à votre jeton comme un tableau d'octets opaque et ne vous soucier de le transformer en/d'une chaîne de caractères que lorsque vous essayez de l'envoyer via un fil ou de le placer dans un cookie ou autre.

+0

'openssl_random_pseudo_bytes' ne donne pas de représentation hexadécimale. Quoi qu'il en soit, c'est une bonne solution. Après cela, c'est juste une question d'utilisation par ex. bcmath pour construire le nombre en base 10 représentation de la chaîne. – Artefacto

+0

Oui, vous avez raison. J'ai mal lu l'exemple et laissé de côté le bit 'bin2hex' :) –

+0

pertinent: voir http://stackoverflow.com/questions/2982112/encoding-arbitrary-data-into-numbers/3402951#3402951 pour savoir comment convertir des données arbitraires en nombres en base 10. – Artefacto

0

Quel est votre but?

Si vous voulez juste un identifiant unique, puis utilisez uniqid:

http://www.php.net/manual/en/function.uniqid.php

Son pas aléatoire, son essentiellement une chaîne hexagonale basée sur microtime. Si vous faites uniqid ('', true), alors il retournera une chaîne hexadécimale basée sur microtime ainsi que virer sur un tas de nombres aléatoires à la fin de l'id (donc même si deux appels arrivent sur la même microseconde, il est peu probable qu'ils partagent un identifiant unique).

Si vous avez besoin d'une chaîne de 16 caractères exactement, dans quel but? Êtes-vous saler les mots de passe? À quel point la chaîne devrait-elle être aléatoire?Dans l'ensemble, vous pouvez toujours le faire:

$toShow = array(); 
for($i = 0; $i<16; $i++){ 
    $toShow[] = chr(mt_rand(ord('a'), ord('z'))); 
} 
return $toShow 

Maintenant, cela crée une chaîne de caractères qui sont entre « a » et « z ». Vous pouvez changer "ord ('a')" à 0, et "ord ('z')" à 255 pour obtenir une chaîne binaire entièrement aléatoire ... ou toute autre gamme dont vous avez besoin.

1

PHP 5.3:

$rand128 = bin2hex(openssl_random_pseudo_bytes(16)); 
Questions connexes