我尝试在 Go 中实现 Drupal 兼容的身份验证并将此包用于 base64 编码:golang.org/src/encoding/base64/base64.go
结果:创建的和在 Drupal 中保存的哈希不匹配。只有在重新实现 Go 的 base64 包之后,我才像在 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
好吧,我这样做而不是谷歌的实现:
...
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编码有名字吗?有文献/出版物参考吗?