Foros del Web » Programando para Internet » PHP »

Hash de longitud determinada

Estas en el tema de Hash de longitud determinada en el foro de PHP en Foros del Web. Muy buenas de nuevo foreros. Resulta que quiero asignar una clave a cada usuario de un sistema web, he pensado en hacer una función del ...
  #1 (permalink)  
Antiguo 24/12/2009, 12:45
 
Fecha de Ingreso: agosto-2003
Ubicación: Málaga, España
Mensajes: 419
Antigüedad: 20 años, 8 meses
Puntos: 1
Pregunta Hash de longitud determinada

Muy buenas de nuevo foreros.

Resulta que quiero asignar una clave a cada usuario de un sistema web, he pensado en hacer una función del tipo:

Código PHP:
funcion getCodigo($email) {
            
$secret 'aquicualquierclave';
            return 
md5($email $secret);

Mi pregunta es que necesitaría que la cadena devuelta por MD5 (u otra función)tenga X caracteres, 32 es demasiado para mi propósito. Y la función debe ser hash porque la clave no está almacenada en ningún sitio, y de esta manera con la función y el email puedo validar perfectamente los datos.
Muchas gracias por la atención y un saludo!
  #2 (permalink)  
Antiguo 24/12/2009, 14:25
Avatar de Claw  
Fecha de Ingreso: abril-2009
Mensajes: 299
Antigüedad: 15 años
Puntos: 9
Respuesta: Hash de longitud determinada

Entonces debes buscar una función de hash que devuelve un número de caracteres igual al que tú necesitas. Si cortaras el resultado de md5 y te quedaras solo con los X primeros caracteres, podrían haber colisiones de claves ya que md5 no asegura que los primeros X caracteres sean únicos, sino los 32 resultantes.

Salu2!

PD: siempre te la puedes crear tú mismo ejecutando varios algoritmos de encriptación seguidos y escogiendo los X primeros caracteres (permutando la clave, transponiéndola, etc).
  #3 (permalink)  
Antiguo 24/12/2009, 16:30
 
Fecha de Ingreso: agosto-2003
Ubicación: Málaga, España
Mensajes: 419
Antigüedad: 20 años, 8 meses
Puntos: 1
Respuesta: Hash de longitud determinada

Hola, gracias por tu respuesta.
Entiendo que no se puede corta la cadena, ¿tienes alguna función para devolver un número de caracteres a eligir?.
O si puedes detallarme un poco más la explicación de cómo hacerla te estaría agradecido igualmente.
Saludos.
  #4 (permalink)  
Antiguo 25/12/2009, 07:54
Avatar de Claw  
Fecha de Ingreso: abril-2009
Mensajes: 299
Antigüedad: 15 años
Puntos: 9
Respuesta: Hash de longitud determinada

Si bueno, me refiero a por ejemplo, crearte una función que implemente el algoritmo César (como resultado obtendrías una cadena de igual longitud a la entrada dada).

http://www.mygnet.net/codigos/php/cr...ado_cesar.1513

El algoritmo es muy simple, pero podría servirte (aunque no es tan seguro como md5; de hecho, no es muy recomendable usarlo, pero al menos la clave no está en texto claro).

Salu2!
  #5 (permalink)  
Antiguo 28/12/2009, 01:57
 
Fecha de Ingreso: agosto-2003
Ubicación: Málaga, España
Mensajes: 419
Antigüedad: 20 años, 8 meses
Puntos: 1
Respuesta: Hash de longitud determinada

Hola de nuevo.
Con la solución que propones necesito una cadena de partida de X caracteres como entrada a la función de codificar. Podría coger esos X caracteres del email y codificar, pero he pensado otra cosa que creo que me viene mejor. Este sería el proceso:

- Si el usuario no tiene código asignado/almacenado generar (hasta que no exista colisión) uno con la función de generación aleatoria que más abajo detallo.
- Almacenar el código en el registro del usuario. cada usuario tendrá su código, con esa función y para un número relativamente alto de usuarios es dificil que exista colisión pues la semilla del random está basado un caracter temporal.
- Validar el usuario es fácil, simplemente comprobar el código que cada usuario tenga almacenado.

Esta es la función. Genera cadenas aleatorias de longitud X
(esta sacada de osCommerce)

Código PHP:
function tep_create_random_value($length$type 'mixed') {
// length es la longitud de la cadena aleatoria a devolver
// type puede ser (mixed,digits,chars)
    
if ( ($type != 'mixed') && ($type != 'chars') && ($type != 'digits')) return false;
    
$rand_value '';
    while (
strlen($rand_value) < $length) {
        if (
$type == 'digits') {
            
$char tep_rand(0,9);
      } else {
        
$char chr(tep_rand(0,255));
      }
      if (
$type == 'mixed') {
        if (
eregi('^[a-z0-9]$'$char)) $rand_value .= $char;
      } elseif (
$type == 'chars') {
        if (
eregi('^[a-z]$'$char)) $rand_value .= $char;
      } elseif (
$type == 'digits') {
        if (
ereg('^[0-9]$'$char)) $rand_value .= $char;
      }
    }
    return 
$rand_value;
}

function 
tep_rand($min null$max null) {
    static 
$seeded;
    if (!isset(
$seeded)) {
      
mt_srand((double)microtime()*1000000);
      
$seeded true;
    }
    if (isset(
$min) && isset($max)) {
      if (
$min >= $max) {
        return 
$min;
      } else {
        return 
mt_rand($min$max);
      }
    } else {
      return 
mt_rand();
    }
  } 
Espero estos comentarios hayan aportado un poco más de materia al tema.
Gracias por vuestra ayuda.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:10.