用openssl手动解密厨师数据包项目

时间:2017-03-08 03:29:53

标签: openssl chef

根据chef中的docs,它使用共享密钥加密数据包项目。

使用以下命令创建共享密钥:

openssl rand -base64 512 | tr -d '\r\n' > encrypted_data_bag_secret

数据以下面的格式保存。

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的人ivkey应该是十六进制的,但我认为我的转换正在向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和共享密钥文件手动解密厨师数据包项目的示例?

2 个答案:

答案 0 :(得分:0)

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

您可以在the encryptor class中看到相关代码。

另请注意,这仅适用于版本1包装物品。我们还有版本2,它添加了你必须剥离的MAC,以及使用aes-256-gcm的版本3。

答案 1 :(得分:0)

扩展@coderanger:

鉴于加密数据包的内容,您需要对ivencrypted_data进行64位解码,然后获取原始键值并在其上运行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现在应该包含您解密的data_bag内容