首页 > 解决方案 > 错误:0409A06E:rsa 例程数据对于密钥大小来说太大

问题描述

我正在生成一个 SAML 响应,它需要使用公钥和私钥进行加密和签名。我使用命令生成private.pempublic.pem在终端中

openssl genrsa -out private.pem 2048
openssl rsa -in ./private.pem -pubout -out public.pem

然后在nodeJS中。

encrypt: function(message) {
    return new Promise(function (resolve, reject) {
        var publicKey = require("fs").readFileSync(__dirname + "/public.pem", "utf8");
        var encrypted = require("crypto").publicEncrypt(publicKey, new Buffer(message));
        resolve(encrypted.toString("base64"));
    });
},

一旦我调用消息encrypt(xml),我就会收到以下错误

{
  library: 'rsa routines',
  function: 'RSA_padding_add_PKCS1_OAEP_mgf1',
  reason: 'data too large for key size',
  code: 'ERR_OSSL_RSA_DATA_TOO_LARGE_FOR_KEY_SIZE'
}

目标

我必须按照samltools.com的演示(模式:SignMessage)对消息进行签名,我的 SAML 消息如下所示。(请参阅 SAML 响应部分)。

  1. 签署消息
  2. Base64Encode消息

标签: node.jscryptographysaml

解决方案


这里的问题是您不能直接使用RSA大于密钥大小的数据进行加密。

我很惊讶,我也很惊讶。

实际上,很少有有效载荷数据直接使用 RSA 甚至椭圆曲线进行加密。

您应该使用 RSA Diffie-Hellman 生成共享密钥。

文件的签名,实际上是文件哈希的签名。


推荐阅读