Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go/Golang中的特殊base64实现(如Drupal的PhpassHashedPassword::base64Encode())_Go_Drupal_Base64_Phpass - Fatal编程技术网

Go/Golang中的特殊base64实现(如Drupal的PhpassHashedPassword::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

我尝试在Go中实现与Drupal兼容的身份验证,并将此包用于base64编码:

结果:创建的和在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
        }

...
。。。
对于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
    }

...