我需要将私有公钥(使用ursa
包生成)和文件发布到NodeJs服务器以对此文件进行签名。这些键的格式如下:
-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQCt6tv2w4sEuHrvCtIgmajM3Dbf7S0aXdM1aG2kON/uG4ibd7R1\n6o
osp847tXgYYJaOB1lKRRDqUETLg1n6LqMHnzNF1NvC0bEtXym90TIXd2CosmWm\nX/R+52
JdM5vuH5kOMuzmYhBTkd8uJln7P+FbuRe9mikRcNSDD2pWojWF3QIDAQAB\nAoGAXhEUrj
Bvpbr+SwKoSpex1DQbvhwzc/phfZahDtzwSYI87hHd2pVj7OlKQ8NQ\nVKcRZ3qUEfavQn
zt6MF/zjChXl67pEG9P6Jv1EAoZjLXf58w0iTJbLZU12Ds53kl\nI4OxnyOCDmPMQiUuDE
XbiJaornSr8Wve8nGje98Ew/WiC6ECQQDUYyJKyGWJXKby\nTe4jj7Wu184v/kgMgRPeOV
3IQZ3WaZDV10BqHd6Nz8ey9sY9hFJML2naSMNSyDXR\nSV5sn/QZAkEA0aFtOvu7K+TEIW
mT14KLN+53IwZ5TVZFomyogkORDe9Q1reIAzV0\n2pNHXiJqMr/MKlp8RD1AKtiWkl6RC/
L4ZQJBAJHy/eG+DGh0jxT7kKZHX2ajTkGU\n0BYnrWuMqHGxBbIOIUWSAeXqWMHDA0xsYJ
Ztk9Be1LL4RaFhi/oiHQ0wbiECQGPY\nnn08jz7t3FkJv2gjfonqZAZju/0Q/WPKm0xIQF
vBw+AxVHAq0viUs6Zrf+eiIO1/\nYbbi8aA2vykCL9XgKV0CQQCeMDc0AJBunncUSgWDnx
AJgW7Th3ukYpEBrJ5gUOpx\n8HKTaIQRv8KLsOkkBhNc5vndTjNDkhJ/ToSkk3tkU29v\n
-----END RSA PRIVATE KEY-----\n
问题是,当我将这样的字符串发布到服务器时,服务器无法检测到新的行字符,并且我在签名时遇到错误(No start line detected
)。
但是,如果我将此行直接粘贴到服务器的函数中 - 就可以了。
所以,我的客户端HTML是:
<form id="addFile">
<div>
<textarea type="text" id="publicKey" name="publicKey" placeholder="public"></textarea>
</div>
<div>
<textarea type="text" id="privateKey" name="privateKey" placeholder="private"> </textarea>
</div>
<div>
<input type="file" id="document" name="document">
</div>
<div>
<input type="submit" onclick="post()" value="Submit">
</div>
</form>
<script>
function post() {
var form = new FormData(document.getElementById('addFile'));
fetch("http://localhost:3001/postfile", {
method: "POST",
body: form
});
}
</script>
我尝试按\n
符号拆分此行,但它不起作用,我还尝试将match
方法与\n
和\n\r
参数和os一起使用.EOL参数 - 不起作用。
来自Firefox的控制台请求后说:
表单包含文件输入,但缺少method = POST和 表单上的enctype = multipart / form-data。该文件将不会被发送。 index.html
TypeError:尝试获取资源时出现NetworkError。 [了解更多]
我的服务器端代码:
const express = require("express");
const bodyParser = require("body-parser");
const multer = require('multer');
const path = require('path');
const os = require('os');
const fs = require('fs');
const crypto = require('crypto')
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'app')));
const storage = multer.diskStorage({
destination: './documents',
filename: function (req, file, cb) {
cb(null, (file.originalname).split('.')[0] + '-' + Date.now() + path.extname(file.originalname));
}
});
const upload = multer({
storage: storage,
limits: { fileSize: 10000000 }
})
app.post('/postfile', upload.single('document'), (req, res, next) => {
var publicKey = req.body.publicKey;
var privateKey = req.body.privateKey;
const sign = crypto.createSign("SHA256");
sign.update('Some data');
sign.sign(privateKey, "hex"); //Error: no start line
})
答案 0 :(得分:1)
换行不是你的问题。您的问题出在textarea
,您在开头发布了一个带有空格的私钥。
<textarea> </textarea>
<!-- ^ this bad boy -->
当您关注该textarea时,复制粘贴密钥,这很可能就是您正在做的事情。空格不会被删除。请注意,插入符号从位置1开始,而不是从0开始。
document.getElementById('privateKey').selectionStart; // 1
除了删除textarea中的空格
<textarea><textarea>
您应该在服务器端执行.trim
,以避免用户添加空格时出现任何问题。
const publicKey = req.body.publicKey.trim();
const privateKey = req.body.privateKey.trim();
发生此特定错误,因为必须键以-----BEGIN RSA PRIVATE KEY-----
<强>更新强>
你真的粘贴了一个私钥:\n
(那些不是换行符,只是文字\\n
,你不应该这样做,而是修复它:
const privateKey = req.body.privateKey.replace(/\\n/g, '\n').trim();
当你在textarea中发布一个包含\n
的字符串时,它将不等于:\n
在javascript中,它将等于\\n
const text = document.getElementById('text').innerHTML;
console.log(`${text}: ${text === '\n'}`);
console.log(`${text}: ${text === '\\n'}`);
<textarea id="text">\n</textarea>