【问题标题】:Equivalent of nodejs crypto crypto.createSign in Python等效于 Python 中的 nodejs crypto crypto.createSign
【发布时间】:2021-08-20 11:16:44
【问题描述】:

我想用 Python 得到同样的结果。

function generateSignature(baseString, privateKey, clientSecret) {
  var signWith = {
    key: (privateKey)
  }; // Provides private key

  if (!_.isUndefined(clientSecret) && !_.isEmpty(clientSecret)) _.set(signWith, "passphrase", clientSecret);

  // Load pem file containing the x509 cert & private key & sign the base string with it to produce the Digital Signature
  var signature = crypto.createSign('RSA-SHA256')
    .update(baseString)
    .sign(signWith, 'base64');

  return signature;
}

我在 Python 中做了什么

    import base64
    from cryptography.hazmat.primitives.asymmetric import dsa, rsa
    from cryptography.hazmat.primitives.serialization import load_pem_private_key
    private_key = load_pem_private_key(
        str.encode(str_private_key),
        password=None)

    plain_text = b'abc'
    signature = private_key.sign(
        data=plain_text,
        padding=padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        algorithm=hashes.SHA256()

    )

    print(base64.b64encode(signature))

我不知道从哪里开始。加密文档很短。密码如何在加密中使用?

【问题讨论】:

    标签: javascript python cryptography


    【解决方案1】:

    NodeJS 代码使用 PKCS#1 v1.5 填充,Python 代码 OAEPadding。要在 Python 中也应用 PKCS#1 v1.5,请按如下方式更改填充:

    signature = private_key.sign(
        data=plain_text,
        padding=PKCS1v15(),         # Fix: Apply PKCS#1 v1.5
        algorithm=hashes.SHA256()
    )
    

    【讨论】:

    • 为什么有人在密钥未加密时使用客户端密钥,为什么称为密码?
    • 如果定义了clientSecret(在加密密钥的情况下),NodeJS 代码似乎会将键/值对 passphrase: <clientSecret> 插入到 signWith 对象中。可能在未加密和加密密钥之间轻松切换,例如在测试和生产环境中。
    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2023-03-04
    • 2013-01-09
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多