将 Python PBKDF2HMAC 转换为 Ruby

问题描述

我在 python 中有以下内容,想将其转移到 ruby​​。但我不明白它的工作。原始来源来自此处:https://github.com/HurricaneLabs/splunksecrets/blob/177d350a9164791c66139d11b4c63f5db83710b6/splunksecrets.py#L112

我的“秘密”是:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

蟒蛇

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),length=32,salt=b"disk-encryption",iterations=1,backend=default_backend()
)
key = kdf.derive(secret[:254])

print("KDF: %s" % key)

红宝石

  require 'openssl'

  kdf = OpenSSL::KDF.pbkdf2_hmac(
    secret,salt: 'disk-encryption',iterations: 1,length: 32,hash: 'SHA256'
  )

  puts "KDF: #{kdf.unpack1('H*')}"

开始和结束在某种程度上相同,但中间根本不匹配。我从 python 字符串中删除了 \x 以更好地阅读它。

org py KDF: b'\x0e\x04\xc2^Z\x04t\xddCh\x97E\xf7\xc9%o\xff\xb8o\x96\x0f\x8aA\xablg\x06\x85\\\xc0\xa3\xde'
Python KDF: b'0e04c2 ^Z04tddCh97Ef7c9%offb8o960f8aAablg0685\\             c0a3de'
Ruby   KDF:   0e04c2 5e5a0474dd43689745f7c9256fffb86f960f8a41ab6c6706855c c0a3de

解决方法

正如 Topaco 在评论中所说:一切正常,只是打印输出格式具有误导性。

Ruby unpack1('H*') 在 Python 中的解释是 .hex()。 所以应该是:

print("KDF: %s" % key.hex())

所以 Ruby 中的 KDF 实现没问题并且一直在工作。只是因为打印出错误格式的值而感到困惑。