Terraform - 已进行 base64 编码的字节的 SHA256 哈希
Terraform - SHA256 hash of bytes that have been base64-encoded
假设我有三个空字节,我对它们进行了 base64 编码:
(Python)
import base64
import hashlib
foo = b'\xd3\x4d\x34'
foo_b64 = base64.b64encode(foo)
print(foo_b64)
# Outputs:
# 0000
foo_sha256 = hashlib.sha256(foo).hexdigest()
print(foo_sha256)
# Outputs:
# 0e10e03565f4664a05c3bc63ed35df3e1a9cb2568371db4f12b66c728943f802
假设我将该 base64 字符串放入 Terraform 配置中:
locals {
foo_b64 = "0000"
}
在 Terraform 中,我需要找到一种方法来获取 foo
的 raw 值的 SHA256 哈希值,即在 Terraform 中我需要生成相同的哈希值(0e10e03565f4664a05c3bc63ed35df3e1a9cb2568371db4f12b66c728943f802
).
我查看了 Terraform 函数,但似乎找不到有用的东西。
sha256(local.foo_b64)
给出 base64 字符串的 SHA256 哈希,而不是它编码的原始字节。
sha256(base64decode(local.foo_b64))
抛出错误:Call to function "base64decode" failed: the result of decoding the provided string is not valid UTF-8.
有什么办法可以实现吗?
Terraform 语言有一个字符串类型,它被定义为包含 Unicode 字符而不是字节,因此任何从原始输入创建字符串的东西都要求输入是 UTF-8 编码的 Unicode 字符。
这意味着通常不可能将原始二进制数据从一个函数传递到另一个函数。对于 Terraform 配置 确实 需要使用小型二进制对象的情况,惯例是将它们作为 base64 编码传递,但这仅在您的配置将 base64 数据视为不透明时才有效,永远不需要解码它,因为没有办法表示解码后的形式。
鉴于此,我认为为了解决 Terraform 的潜在问题,您需要采取不同的方法。例如,也许任何生成 base64 字符串的外部系统也可以生成它的 SHA256 校验和,Terraform 然后也会将其视为不透明,而不是尝试直接计算它。你在这里提出了一个未说明问题的技术解决方案,所以我不能更具体地说明其他选项可能是什么,但主要要求是 Terraform 将逐字传递(base64 编码的)二进制数据给提供者,永远不要直接询问它。
假设我有三个空字节,我对它们进行了 base64 编码:
(Python)
import base64
import hashlib
foo = b'\xd3\x4d\x34'
foo_b64 = base64.b64encode(foo)
print(foo_b64)
# Outputs:
# 0000
foo_sha256 = hashlib.sha256(foo).hexdigest()
print(foo_sha256)
# Outputs:
# 0e10e03565f4664a05c3bc63ed35df3e1a9cb2568371db4f12b66c728943f802
假设我将该 base64 字符串放入 Terraform 配置中:
locals {
foo_b64 = "0000"
}
在 Terraform 中,我需要找到一种方法来获取 foo
的 raw 值的 SHA256 哈希值,即在 Terraform 中我需要生成相同的哈希值(0e10e03565f4664a05c3bc63ed35df3e1a9cb2568371db4f12b66c728943f802
).
我查看了 Terraform 函数,但似乎找不到有用的东西。
sha256(local.foo_b64)
给出 base64 字符串的 SHA256 哈希,而不是它编码的原始字节。sha256(base64decode(local.foo_b64))
抛出错误:Call to function "base64decode" failed: the result of decoding the provided string is not valid UTF-8.
有什么办法可以实现吗?
Terraform 语言有一个字符串类型,它被定义为包含 Unicode 字符而不是字节,因此任何从原始输入创建字符串的东西都要求输入是 UTF-8 编码的 Unicode 字符。
这意味着通常不可能将原始二进制数据从一个函数传递到另一个函数。对于 Terraform 配置 确实 需要使用小型二进制对象的情况,惯例是将它们作为 base64 编码传递,但这仅在您的配置将 base64 数据视为不透明时才有效,永远不需要解码它,因为没有办法表示解码后的形式。
鉴于此,我认为为了解决 Terraform 的潜在问题,您需要采取不同的方法。例如,也许任何生成 base64 字符串的外部系统也可以生成它的 SHA256 校验和,Terraform 然后也会将其视为不透明,而不是尝试直接计算它。你在这里提出了一个未说明问题的技术解决方案,所以我不能更具体地说明其他选项可能是什么,但主要要求是 Terraform 将逐字传递(base64 编码的)二进制数据给提供者,永远不要直接询问它。