Go/Golang中的特殊base64实现(如Drupal的PhpassHashedPassword::base64Encode())
我尝试在Go中实现与Drupal兼容的身份验证,并将此包用于base64编码: 结果:创建的和在Drupal中保存的哈希不匹配。只有在重新实现Go的base64包之后,我才能像Drupals base64Encode()一样进行位移位,哈希匹配:Go/Golang中的特殊base64实现(如Drupal的PhpassHashedPassword::base64Encode()),go,drupal,base64,phpass,Go,Drupal,Base64,Phpass,我尝试在Go中实现与Drupal兼容的身份验证,并将此包用于base64编码: 结果:创建的和在Drupal中保存的哈希不匹配。只有在重新实现Go的base64包之后,我才能像Drupals base64Encode()一样进行位移位,哈希匹配: input bit location: abcdefgh ijklmnop qrstuvwx Go's base64.go bit location: ..abcdef ..ghijkl ..mnopqr
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
}
...
。。。
对于si>6&0x3F]
dst[di+3]=编码编码[val&0x3F]
si+=3
di+=4
}
...
我现在代表Drupal的base64Encode()实现了自己的实现
。。。
对于si //val:=uint(src[si+0])您使用的是哪种go base64编码?有四种标准:标准编码或URL编码,没有填充。我猜其中一种会符合您的要求。Drupal的实现来自。如果您访问他们的网站并下载,您会发现一些C代码可能更易于移植。您能告诉我们实际的authentica吗问题[X]而不是你认为正在发生的奇怪的编码问题?[Y]@ChrisHaas它实际上只是一个包装器,我很难相信Go是否已经有了这方面的东西。唯一的症结可能是PHP端使用了新的Argon哈希。哈希部分是,但bas64编码是本机的。老实说,我不知道除了所使用的框架之外,为什么还需要自定义base64函数支持PHP 3。我同意这可能是xy问题。您使用的是哪种go base64编码?有四种标准:标准编码或URL编码,不带填充。我猜其中一种会符合您的要求。Drupal的实现来自。如果您访问他们的网站并下载,您会发现一些C代码可能很简单er to port to GO.你能告诉我们实际的身份验证问题[X]而不是你认为正在发生的这种奇怪的编码问题吗?[Y]@ChrisHaas它实际上只是一个包装器,我很难相信Go是否已经有了这方面的东西。唯一的症结可能是PHP端使用了新的Argon哈希。哈希部分是,但bas64编码是本机的。老实说,我不知道除了所使用的框架之外,为什么还需要自定义base64函数为了支持PHP3,我同意这可能是xy的问题。
...
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
}
...