Ruby 的 Base64 的 Python 等价物是什么。urlsafe_encode64(Digest::SHA256.hexdigest(STRING))

What is the Python equivalent of Ruby's Base64.urlsafe_encode64(Digest::SHA256.hexdigest(STRING))

我正在尝试将 ruby 项目的一部分移植到 python 并且无法找出等同于 Base64.urlsafe_encode64(Digest::SHA256.hexdigest(STRING)) 我得到的最接近的是 base64.urlsafe_b64encode(hashlib.sha256(STRING.encode('utf-8')).digest()) 但是给出Whosebug it returns 的输入:b'HFqE4xhK0TPtcmK7rNQMl3bsQRnD-sNum5_K9vY1G98=' for Python and MWM1YTg0ZTMxODRhZDEzM2VkNzI2MmJiYWNkNDBjOTc3NmVjNDExOWMzZmFjMzZlOWI5ZmNhZjZmNjM1MWJkZg== in Ruby.

完整 Python & Ruby 代码:


Ruby

require "base64"
require "digest"

string= "Whosebug"
output= Base64.urlsafe_encode64(Digest::SHA256.hexdigest(string))

puts output

Python

import hashlib
import base64

string = str("Whosebug")
output = base64.urlsafe_b64encode(hashlib.sha256(string.encode('utf-8')).digest())

print(str(output))

您需要在 Python 中的散列上使用 hexdigest 方法而不是 digest 以获得与 Ruby 示例中相同的输出(因为您使用hexdigest 功能在那里)。

另请注意,hexdigest 方法 returns 是一个字符串而不是字节,因此您需要再次对结果进行编码(使用 .encode("utf-8"))。

这是一个完整的例子:

import hashlib
import base64

string = "Whosebug"
output = base64.urlsafe_b64encode(hashlib.sha256(string.encode("utf-8")).hexdigest().encode("utf-8"))

print(str(output))

在您原来的 Python 代码中,您使用 digest 而不是 hexdigest,这会产生不同的结果,因为它们不是一回事。请记住,将代码转换为不同的语言可能非常困难,因为您需要充分理解这两种语言才能比较代码。尝试逐段剖析代码,拆分行并打印每个字符串输出/在每个阶段给出输出以检查发生了什么。

将所有内容都塞到一行中可能会很混乱,而且您很容易忽略可能在错误修复中发挥重要作用的不同因素。

你应该先写你的代码“spaced-out”,在生产中你可以把代码改成单行,虽然它不是很长的代码可读性。


您要找的是:

string = str("Whosebug")
output = hashlib.sha256(code_verifier.encode('utf-8')).hexdigest()
output = base64.urlsafe_b64encode(code_challenge.encode('utf-8'))

print(str(output.decode('utf-8')))

它给出相同的结果,就像您在 ruby 中使用 Base64.urlsafe_encode64(Digest::SHA256.hexdigest(string)) 一样。