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))
一样。
我正在尝试将 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))
一样。