Специальная реализация base64 в Go / Golang (например, в Drupal PhpassHashedPassword :: base64Encode ()) - PullRequest
1 голос
/ 16 июня 2020

Я пытался реализовать совместимую с 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 имя? Есть ли ссылки на литературу / публикации?
...