2011-09-15 6 views
5

phpass usa un algoritmo extraño (para mí) en encode64() para codificar en base 64. Base64 y Uuencode trozos lineales de 6 bits para producir cada octeto antes de mapear a un char imprimible. encode64 baraja los bits en torno a:Encoder personalizado base phpass 64: ¿tiene un nombre/ventaja sobre Base64?

input bit location: abcdefgh ijklmnop qrstuvwx 
base64 bit location: ..abcdef ..ghijkl ..mnopqr ..stuvwx 
encode64 bit location: ..cdefgh ..mnopab ..wxijkl ..qrstuv 

¿Es este algoritmo comúnmente conocido? Y además compatibilidad con versiones anteriores, ¿por qué elegirlo en Base64?

A continuación he reescrito para aclarar el algoritmo: ''

function encode64($input, $bytesToProcess) 
{ 
    // convert to array of ints 
    for ($i = 0; $i < $bytesToProcess; $i++) { 
     $bytes[] = ord($input[$i]); 
    } 

    $octets = array(); 
    $i = 0; 
    do { 
     $value = $bytes[$i++]; 
     $octets[] = $value & 0x3f; 
     if ($i < $bytesToProcess) { 
      $value |= $bytes[$i] << 8; 
     } 
     $octets[] = ($value >> 6) & 0x3f; 
     if ($i++ >= $bytesToProcess) { 
      break; 
     } 
     if ($i < $bytesToProcess) { 
      $value |= $bytes[$i] << 16; 
     } 
     $octets[] = ($value >> 12) & 0x3f; 
     if ($i++ >= $bytesToProcess) { 
      break; 
     } 
     $octets[] = ($value >> 18) & 0x3f; 
    } while ($i < $bytesToProcess); 

    return array_map(function ($i) { 
     return str_pad(base_convert($i, 10, 2), 6, '0', STR_PAD_LEFT); 
    }, $octets); 
} 

var_export(encode64("Man", 3)); 

(actualizado para indicar exactamente donde se mueve cada bit de entrada)

+0

[Puerto de Drupal] (http://drupalcode.org/project/drupal.git/blob/refs/heads/7.x:/includes/password.inc#l46) describe esto como "el estándar * nix de crypt() " –

Respuesta

1

encode64() sólo se parece a una implementación de base 64 estándar que cuenta bits en el orden inverso y utiliza un conjunto de caracteres diferente - si entrecierra los ojos de la manera correcta, es la selección de las últimos 6 bits del primer byte para el primer personaje de salida, por ejemplo. Esto es probablemente solo un error; no hay ningún beneficio de seguridad o rendimiento al hacerlo de esta manera (y algunos inconvenientes de rendimiento en relación con el base64_encode nativo de PHP).

+0

Me parece que está haciendo un intercambio de bytes en ambos extremos: invierta el orden de los 3 bytes de entrada, córtelos en trozos de 6 bits y luego invierta el orden de los bytes de salida. – Simon

+0

Creo que tendría el mismo efecto, sí. De cualquier manera, es una inversión en algún momento del proceso. – duskwuff

0

encode64 usa y '/' al lado de a-zA-Z0-9. Base64 usa '+' y '/'. También '.' Y '/' se asignan a 0 y 1, mientras que '+' y '/' se asignan a 62 y 63 en Base64.

UUencode usa letras, dígitos y muchos signos de puntuación para ser compatible con sistemas sin mayúsculas.

No estoy familiarizado con encode64. La única razón para usarlo sería si '+' no está permitido en el entorno que utiliza. Pero entonces podrías usar Base64 y hacer un str_replace.

Cuestiones relacionadas