node.js - 错误:0409A06E:rsa 例程数据对于密钥大小来说太大
问题描述
我正在生成一个 SAML 响应,它需要使用公钥和私钥进行加密和签名。我使用命令生成private.pem
并public.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 响应部分)。
- 签署消息
- Base64Encode消息
解决方案
这里的问题是您不能直接使用RSA
大于密钥大小的数据进行加密。
我很惊讶,我也很惊讶。
实际上,很少有有效载荷数据直接使用 RSA 甚至椭圆曲线进行加密。
您应该使用 RSA Diffie-Hellman 生成共享密钥。
文件的签名,实际上是文件哈希的签名。
推荐阅读
- java - 有没有办法将从一个进程对象的 getOutPutStream() 方法获得的输出保存到一个文件中
- python - 如何在 Tkinter 中使用 .after 使按钮闪烁?
- ruby-on-rails - 服务时出现 Ruby/Jekyll 要求错误
- php - 如何将变量从控制器传递到路由文件?
- c++ - 如何将库编译到 lib/ 文件夹中?
- cplex - 较长的 AMPL 模型准备时间
- etl - 未报告 DAG 故障
- node.js - 电子邮件模板/Nodemailer 电子邮件不包含模板
- swiftui - 如何在 SwiftUI Picker 中创建老虎机隐喻?
- python - 有没有办法找到时间序列数据的“调用”函数?