Я пытался реализовать совместимую с Drupal аутентификацию в Go и использовать этот пакет для кодировки base64: golang .org / src / encoding / base64 / base64. go
Результат: созданные и сохраненные в Drupal хэши не совпадают. Только после повторной реализации пакета base64 Go, где я выполняю сдвиг битов, как в Drupals base64Encode (), хеши совпадают:
input bit location: abcdefgh ijklmnop qrstuvwx
Go's base64.go bit location: ..abcdef ..ghijkl ..mnopqr ..stuvwx
PHP's base64Encode() bit location: ..cdefgh ..mnopab ..wxijkl ..qrstuv
Ну, я делаю вместо реализации Google:
...
for si < n {
// Convert 3x 8bit source bytes into 4 bytes
val := uint(src[si+0])<<16 | uint(src[si+1])<<8 | uint(src[si+2])
dst[di+0] = enc.encode[val>>18&0x3F]
dst[di+1] = enc.encode[val>>12&0x3F]
dst[di+2] = enc.encode[val>>6&0x3F]
dst[di+3] = enc.encode[val&0x3F]
si += 3
di += 4
}
...
моя собственная реализация теперь от имени Drupal base64Encode ()
...
for si < n {
// Convert 3x 8bit source bytes into 4 bytes
// val := uint(src[si+0])<<16 | uint(src[si+1])<<8 | uint(src[si+2])
val := uint(src[si+0]) | uint(src[si+1])<<8 | uint(src[si+2])<<16
dst[di+0] = enc.encode[val&0x3F]
dst[di+1] = enc.encode[val>>6&0x3F]
dst[di+2] = enc.encode[val>>12&0x3F]
dst[di+3] = enc.encode[val>>18&0x3F]
si += 3
di += 4
}
...
Мои вопросы:
- уже есть в Go реализации, как я ( переопределил Drupal base64Encode ())?
- есть ли у этой специальной кодировки base64 имя? Есть ли ссылки на литературу / публикации?