Javascript 如何检查ECC密钥和公钥是否通过Js文件传递?

Javascript 如何检查ECC密钥和公钥是否通过Js文件传递?,javascript,node.js,security,messaging,pubnub,Javascript,Node.js,Security,Messaging,Pubnub,我找不到问题所在。我使用PubNub进行实时消息传递,示例项目使用ECC(椭圆曲线加密)加密消息传递 除了发送消息之外,文件中的所有内容都有效(动画、频道显示等)。每次点击send,我都会收到以下信息: 这是我的chat-app.js文件: (function() { if (typeof(user) === 'undefined') { return; } var output = document.getElementById('output'), i

我找不到问题所在。我使用PubNub进行实时消息传递,示例项目使用ECC(椭圆曲线加密)加密消息传递

除了发送消息之外,文件中的所有内容都有效(动画、频道显示等)。每次点击send,我都会收到以下信息:

这是我的chat-app.js文件:

(function() {

  if (typeof(user) === 'undefined') {
    return;
  } 

  var output = document.getElementById('output'), 
      input = document.getElementById('input'), 
      picture = document.getElementById('picture'),
      presence = document.getElementById('presence'),
      action = document.getElementById('action'),
      send = document.getElementById('send');

  var channel = 'fun';

  var keysCache = {};

  var pubnub = PUBNUB.init({
      subscribe_key: 'sub-c-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
      publish_key: 'pub-c-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
      uuid: user.name,
      auth_key: user.gtoken,
      ssl: true
  });


  function displayOutput(message) {
    if(!message) return;
    if(typeof(message.text) === 'undefined') return;

    var html = '';

    if ('userid' in message && message.userid in keysCache) {

      var signature = message.signature;

      delete message.signature;

      var result = ecc.verify(keysCache[message.userid].publicKey, signature, JSON.stringify(message));

      if(result) {
        html = '<p><img src="'+ keysCache[message.userid].picture +'" class="avatar"><strong>' +  keysCache[message.userid].name + '</strong><br><span>' + message.text + '</span></p>';
      } else {
        html = '<p><img src="images/troll.png" class="avatar"><strong></strong><br><em>A troll tried to spoof '+ keysCache[message.userid].name +' (but failed).</em></p>';
      } 

      output.innerHTML = html + output.innerHTML;

    } else {
      var xhr = new XMLHttpRequest();
      xhr.open('GET', '/user/' + message.userid, true);
      xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
          var res = JSON.parse(xhr.responseText);

          keysCache[message.userid] = {
            'publicKey': res.publicKey,
            'name': res.name,
            'artist': res.artist,
            'picture': res.picture,
            'id': res.id
          }
          displayOutput(message);
        }
      };
      xhr.send(null); 
    }
  }

  function getHistory() {
    pubnub.history({
      channel: channel,
      count: 30,
      callback: function(messages) {
        messages[0].forEach(function(m){ 
          displayOutput(m);
        });
      }
    });
  }

  pubnub.subscribe({
    channel: channel,
    restore: true,
    connect: getHistory,
    disconnect: function(res){
      console.log('disconnect called');
    },
    reconnect: function(res){
      console.log('reconnecting to pubnub');
    },
    callback: function(m) {
      displayOutput(m);
    },
    presence: function(m){
      if(m.occupancy === 1) {
        presence.textContent = m.occupancy + ' person online';
      } else {
        presence.textContent = m.occupancy + ' people online';
      }
      if((m.action === 'join') || (m.action === 'timeout') || (m.action === 'leave')){
        var status = (m.action === 'join') ? 'joined' : 'left';
        action.textContent = m.uuid + ' ' + status +' room';
        action.classList.add(m.action);
        action.classList.add('poof');
        action.addEventListener('animationend', function(){action.className='';}, false);
      }
    }
  });

  function post() {
    var safeText = input.value.replace(/\&/g, '&amp;').replace( /</g,  '&lt;').replace(/>/g,  '&gt;');
    var message = { text: safeText, userid: user.id };

    var signature = ecc.sign(user.eccKey, JSON.stringify(message));
    message['signature'] = signature;

    pubnub.publish({
      channel: channel,
      message: message
    });

    input.value = '';
  }

  input.addEventListener('keyup', function(e) {
    if(input.value === '') return;
    (e.keyCode || e.charCode) === 13 && post();
  }, false);

  send.addEventListener('click', function(e) {
    if(input.value === '') return;
    post();
  }, false);


})();
但是,我假设错误在chat-app.js文件中,因为我没有触摸ecc.js文件。我从项目中得到的--


有关ECC的更多信息可在此处找到:

根据您的描述,这一行似乎给出了错误信息:

var signature = ecc.sign(user.eccKey, JSON.stringify(message));
所以我猜您没有正确地传递user.eccKey

您是否拥有来自oAuth(或任何登录验证)的所有用户数据?或者在用户注册时正确生成eccKey

此外,请尝试包含ecc.js的非精简版本,以便更轻松地跟踪错误的来源。

根据您的描述,这一行似乎给出了错误:

var signature = ecc.sign(user.eccKey, JSON.stringify(message));
所以我猜您没有正确地传递user.eccKey

您是否拥有来自oAuth(或任何登录验证)的所有用户数据?或者在用户注册时正确生成eccKey

此外,请尝试包含ecc.js的非精简版本,以便更轻松地跟踪错误的来源。

那么您的实际问题是什么?@zerkms我正在试图找出为什么会出现错误(Uncaught TypeError:无法读取undefined的属性'r')。如果错误来自ecc.js,那么您应该能够识别发生错误时调用的函数,以及在代码中调用该函数的位置。提供此信息以便于调试。因为您试图读取未定义的
值的属性
r
。@单击chat-app.js中的“send.addEventListener”时会发生GreatContini错误。我一直在查看ecc.js文件以找到'r'(),其中充满了我无法理解的算法。我会继续研究它,只是想得到一些帮助,如果有人遇到类似的事情。那么你的实际问题是什么?@zerkms我正在试图找出为什么我会出现错误(Uncaught TypeError:Cannot read property'r'of undefined),如果错误来自ecc.js,然后,您应该能够识别发生错误时调用的函数,以及在代码中调用该函数的位置。提供此信息以便于调试。因为您试图读取未定义的
值的属性
r
。@单击chat-app.js中的“send.addEventListener”时会发生GreatContini错误。我一直在查看ecc.js文件以找到'r'(),其中充满了我无法理解的算法。我会继续研究它,只是想得到一些帮助,如果有人遇到类似的事情。我正在使用谷歌oauth,我可以看到我的所有数据库数据存储在节点持久注册后,但我假设密钥存储在PubNub历史记录中。我同意eccKey没有被正确处理,因为我只是试图在控制台中输出它,并且在passport序列化之后它是“未定义”的。我会继续挖掘。我真的很感激!是的,您应该将密钥存储在数据库中,所以使用node persist应该可以!(将PubNub History用作DB对于现实场景来说不是一个好主意!回购协议上的原始代码只是一个演示。)谢谢,问题解决了!我只是取出了DB伪通道,使用了我的Mongo DB。@Chā你是怎么做到的,请解释一下。我使用的是google oauth,我可以在注册时看到存储在node persist中的所有数据库数据,但我假设密钥存储在PubNub历史记录中。我同意eccKey没有被正确处理,因为我只是试图在控制台中输出它,并且在passport序列化之后它是“未定义”的。我会继续挖掘。我真的很感激!是的,您应该将密钥存储在数据库中,所以使用node persist应该可以!(将PubNub History用作DB对于现实场景来说不是一个好主意!回购协议上的原始代码只是一个演示。)谢谢,问题解决了!我只是取出了DB伪通道,使用了我的Mongo DB。@Chā你是怎么做到的,请你解释一下。