无法从发布请求中检测字符串中的\ n字符

时间:2018-06-02 12:00:47

标签: node.js rsa

enter image description here我需要将私有公钥(使用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
})

1 个答案:

答案 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>