如何加密 pouchdb 数据库

How to encrypt a pouchdb database

本文关键字:pouchdb 数据库 加密 何加密      更新时间:2023-09-26

背景:

我正在尝试使用加密袋库加密 pouchdb 数据库。我看了一下 https://github.com/calvinmetcalf/crypto-pouch 显示的示例但它似乎对我没有任何作用。

我的代码:

<!DOCTYPE html>
<html ng-app="pouchdbApp">
 <head>
   <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
   <script src="pouchdbDemo.js"></script>
   <script src="http://cdn.jsdelivr.net/pouchdb/5.2.1/pouchdb.min.js"></script>
   <!-- <script src="crypto-pouch-master/bundle.js"></script> -->
   <script src="http://wzrd.in/standalone/crypto-pouch"></script>
   <script>
       var db = new PouchDB('kittens2');
       var password = "mypassword";
      db.crypto(password).then(function (publicKey) {
            console.log("publicKey");
   	    console.log(publicKey);
       });
   
       /* db.removeCrypto();  */
       var doc = {
		  "_id": "mittens",
		  "name": "Mittens",
		  "occupation": "kitten",
		  "age": 3,
		  "hobbies": [
		    "playing with balls of yarn",
		    "chasing laser pointers",
		    "lookin' hella cute"
 		   ]
		};
      
      db.put(doc);
      db.get('mittens').then(function (doc) {
         console.log(doc);
      });
   </script>
 </head>
 <body>
 </body>
</html>

但是我的代码看不到对输入的数据进行任何加密,或者我看不到生成的任何公钥。

任何线索我应该如何使用带有 pouchdb 的加密袋库。

编辑:此答案最初参考到加密袋的 1.x 版本,但对于当前版本 (3.x) 不正确,在当前版本中 db.crypto(password) 不返回承诺,因此更新的代码示例是

db.crypto(password)
// <-- encryption set up

db.crypto(password);
db.put({_id: 'foo', bar: 'baz'}).then(function () {
    return db.get('foo');
}).then(function (doc) {
    console.log('decrypted', doc);
    return db.removeCrypto();
}).then(function () {
    return db.get('foo');
}).then(function (doc) {
    console.log('encrypted', doc);
})

原始答案(对 v1.x 仍然有效)如下:

所以文档有点混乱(我刚刚清理了),但是当您调用db.crypto时,它会包装数据库,以便对文档进行透明加密和解密

db.crypto(password).then(function () {
   // <-- encryption set up
})

它将透明地加密您创建的文档并解密您阅读的文档,直到您调用

db.removeCrypto();

所以如果你想测试,做一些类似的事情

db.crypto(password).then(function () {
   return db.put({_id: 'foo', bar: 'baz'});
}).then(function () {
    return db.get('foo');
}).then(function (doc) {
    console.log('decrypted', doc);
    return db.removeCrypto();
}).then(function () {
    return db.get('foo');
}).then(function (doc) {
    console.log('encrypted', doc);
})

我尝试了combDB,它是目前似乎唯一适用于新nodeJS的数据库

const PouchDB = require('pouchdb')
PouchDB.plugin(require('comdb'))
const password = 'extremely secure value'
const db = new PouchDB(POUCH_PATH)
db.setPassword(password)
db.post({
  _id: 'gay-agenda',
  type: 'queerspiracy',
  agenda: ['be gay', 'do crimes']
}).then(() => {
  // now replicate to a couchdb instance
  return db.replicate.to(`${COUCH_URL}/FALGSC`)
})

或使用 Angular(打字稿)

import PouchDB from 'pouchdb-browser';
...
 this.db = new PouchDB('myProjectDB');
 this.db.setPassword(environment.dbPassword);