0

大家。

我对系统的这一部分有疑问:我想加密一些从用户到数据库的消息,并在向用户显示时解密它们(这只是出于隐私原因)。由于我找不到任何本机加密/解密库甚至更好的解决方案,所以我使用的是“crypto-js”(https://code.google.com/p/crypto-js/),到目前为止运行良好。问题是:当用户写一条消息时,我对其进行加密并将其保存在数据库中。但是,当我使用模板助手中的“查找”方法从数据库中检索该消息时(使用反应式计算思想来接近所需的“实时 HTML”),我得到的只是一个将用于呈现消息的光标在我的 HTML 中。如您所见,显示的消息没有被解密。我正在考虑从光标“获取”数据,在所有消息的“for循环”中运行解密函数,但这太低效了。我想知道是否有人知道如何在渲染之前从光标操作数据,然后我将能够即时解密每条消息。

非常感谢您的关注,抱歉打扰。

4

3 回答 3

3

您可以使用转换功能。使用光标时传递转换,因此它仅在使用时在每个文档上运行:

YourCollection.find({}, {transform:function(doc) {

    var encrypted = doc.field1;
    doc.field1 = decrypt(encrypted)

    return doc;

});

所以现在每个都field1将被解密(在网络浏览器上)。就在它被使用之前。如果你使用.fetch(),你也会得到所有的解密数据。

于 2013-07-19T07:31:57.737 回答
1

你没有在这里发布相关代码,但我假设你已经做了这样的事情:

Template.yourTemplate.yourHelper = function(){
    return yourCollection.find({});
}

问题是您正在以游标的形式将数据返回给助手,这通常是完全可以接受的。但是,当您将加密消息存储在集合中时,每条消息都会按原样呈现,而无需执行解密。

因此,尝试获取一个数组而不是使用光标来获取find().fetch()与您的光标等效的数组。就像是 :

Template.yourTemplate.yourHelper = function(){
      var msg_arr = yourCollection.find({}).fetch(); // gives array instead of cursor.

      msg_arr.forEach( function( msg ){ 
         // traverse through each element of array and
         // perform decryption.
      });
}
于 2013-07-19T07:32:12.983 回答
1

我刚刚在#meteor IRC 频道进行了一次演讲,并提出了一些想法。我认为这是我的案例的最佳解决方案:

{{#each messages}}
    {{decrypt}}
{{/each}}

当助手从上下文中获取数据时,助手“解密”将循环中的实际“消息”作为“this”对象。然后,我进行了解密并以纯文本形式返回了消息。它工作得很好,进一步它被称为反应式并利用光标(即在展览期间数据发生变化时动态更新)。

感谢所有帮助过我的人。

于 2013-07-19T08:29:39.897 回答