使用openssl手动解密chef数据包项目

使用openssl手动解密chef数据包项目,openssl,chef-infra,Openssl,Chef Infra,根据in-chef的说法,它使用一个共享秘密来加密数据包项目 共享机密是通过以下方式创建的: openssl rand-base64 512 | tr-d'\r\n'>加密的(数据)包(秘密) 数据以以下格式保存 id: mysql pass: cipher: aes-256-cbc encrypted_data: JZtwXpuq4Hf5ICcepJ1PGQohIyqjNX6JBc2DGpnL2WApzjAUG9SkSdv75TfKSjX4 iv:

根据in-chef的说法,它使用一个共享秘密来加密数据包项目

共享机密是通过以下方式创建的:

openssl rand-base64 512 | tr-d'\r\n'>加密的(数据)包(秘密)

数据以以下格式保存

id:   mysql

pass:
cipher:         aes-256-cbc
encrypted_data: JZtwXpuq4Hf5ICcepJ1PGQohIyqjNX6JBc2DGpnL2WApzjAUG9SkSdv75TfKSjX4
iv:             VYY2qx9b4r3j0qZ7+RkKHg==
version:        1

user:
cipher:         aes-256-cbc
encrypted_data: 10BVoNb/plkvkrzVdybPgFFII5GThZ3Op9LNkwVeKpA=
iv:             uIqKHZ9skJlN2gpJoml6rQ==
version:        1
我试图使用openssl解密其中一个项目,但未能获得正确的魔法组合

使用上面的示例数据,下面是我想到的最好的命令,我认为应该可以工作。数据是base64解码的,并且来自openssl man的
iv
key
应该是十六进制的,但我认为我的转换为openssl提供了正确的数据

cat 'JZtwXpuq4Hf5ICcepJ1PGQohIyqjNX6JBc2DGpnL2WApzjAUG9SkSdv75TfKSjX4' > encrypted_data
cat 'VYY2qx9b4r3j0qZ7+RkKHg==' > iv

openssl enc -d -aes-256-cbc -a \
  -in encrypted_data \
  -K $(cat encrypted_data_bag_secret|base64 -d|xxd -p) \
  -iv $(cat iv|base64 -d|xxd -p) 

是否有人知道我做错了什么,或者有使用openssl和共享机密文件手动解密chef数据包项目的工作示例?

通过SHA256运行密钥数据,并确保使用原始摘要,而不是十六进制或base64。您也不想成为base64首先对其进行解码,我们在base64模式下生成密钥只是为了使其仅使用可打印字符,而不是因为它曾经用作base64数据

您可以在中看到相关代码


还要记住,这只适用于版本1的行李物品。我们还有版本2,它添加了一个您必须剥离的MAC,版本3则使用aes-256-gcm。要扩展@coderanger:

给定加密数据包的内容,您需要对
iv
加密的\u数据进行base64解码,然后获取原始密钥值并对其运行SHA256。下面是一个使用上面的
pass
数据包项的Python脚本示例:

import hashlib
from base64 import b64decode
from Crypto.Cipher import AES

iv = b64decode('VYY2qx9b4r3j0qZ7+RkKHg==')
key = 'data_bag_key_used_to_encrypt_data_bag'
key = hashlib.sha256(key.encode()).digest()
encoded = b64decode('JZtwXpuq4Hf5ICcepJ1PGQohIyqjNX6JBc2DGpnL2WApzjAUG9SkSdv75TfKSjX4')

dec = AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
value = dec.decrypt(encoded)

value
现在应该包含您的解密数据\u包内容

我想知道您为什么这样做吗?我必须审核我们的厨师服务器。。。多个数据包已经失去同步,我想测试数据包文件的本地git保存版本,看看哪些文件已经使用“公共”密钥文件加密。好的,那么为什么不使用Chef而不是bash脚本和
openssl
?因为我引用的是local.json,所以我认为通过jq解析并将加密的_数据和iv密钥值输入到openssl会更容易,以获得简单的成功| |失败。但我认为使用openssl将更容易插入价值和利润。
knife-z数据包show
是你的朋友:)