We've seen gundb [http://gun.js.org/] keeping data distributed between clients. Also, I'm even thinking if it is possible to run ZeroDB on top of SpiderOak's Crypton (which is inspired by ZODB) :-)
148 karma · joined May 6, 2013
We've seen gundb [http://gun.js.org/] keeping data distributed between clients. Also, I'm even thinking if it is possible to run ZeroDB on top of SpiderOak's Crypton (which is inspired by ZODB) :-)
So, things people dreamed about inside ZODB, pretty much :-)
But when indexing large texts, it becomes a problem. One way to solve it is instead of using generic serializing for data structures, take real structure into account. Many isinstance() calls cause the CPU bottleneck [http://www.upfrontsystems.co.za/Members/roche/where-im-calli...]. Though, it turns out to be not as bad [http://www.upfrontsystems.co.za/Members/roche/where-im-calli...]
2. Same as (1). You either re-encrypt all the content keys on the client side, which could be an expensive process. Or you use proxy re-encryption to let the server re-encrypt data for your new key.
3. That I don't understand. Ok, attacker breaks into remote database. What can he do? When user logs in, he[user] doesn't ever say decryption key to the server. That was the whole point of this article :-)
But if you are to perform heavy computing on server side, you have to be homomorphic. Or other amazing opportunities like decentralized key management, content tokenization (DRM) etc appear from this homomorphic work (even if the speed is 100 times slower than unencrypted)
More than that: when end-user is SMB but paying customer is a B2B cloud software vendor, needs are often the same as for startups.
Basically, end-to-end encryption for client (browser, mobile) software vs protecting backend software which uses some flavor of SQL
My point is that you can tolerate that if your application is something like gmail. Client A has his own tree saved on the server, not intersecting with the tree of client B. Client A probably is not going to write from multiple places simultaneously too often.
But if you have groups of clients writing to the same tree, I think it's better to have some writing client which handles multiple commits of others.
Yes, you're correct! ;-)
> "one table, one source of truth, period," or "Use for write-seldom; read-often applications only,"
Right. Another model - "write and read only your private information". So, three use-cases here
> information leakage issues
I already think, for solving this we probably should just switch to ORAM. Very valid concern! That said, we cannot really deduce the order of objects referenced in leaf nodes (and there could be a thousand of them).
In any case. Expect our implementation to be extremely simple (but useful) first. Probably suitable for "users record their private info" application. Then we'll be addressing scalability issues, information leakage etc.
One thing which we will probably inherit from ZODB is server-side versioning of all objects. E.g. if something gets corrupted, it's easy enough to roll back to a previous version.
If the model is "each user has its very own private tree" applies (would be the case for gmail or evernote-like application), I think clients quite can maintain it (having the version history, of course). If it's groups of users having access to the same objects, we should have some maintenance clients.
In our db, random observer cannot see how data are ordered or whether elements are equal to each other.
Homomorfic encryption would be ideal of course, but it is slow and impractical for the moment
ZODB on which we base is ACID-complaint, so it cares about simultaneous writes. You either don't use cache, or get invalidation requests if you do (so that you have up-to-date tree if you want to update).
Though, it sounds like the ideal situation is when each user has his own private data, so there are not so many simultaneous writes into the same tree.
I guess, we can have another type of behavior where all new fields are indexed. It doesn't sound like a "clean way" to me, however some developers could desire that
While that's ok for Zope/ZODB developers, it's not for an average user. We need to wrap it up to make easily usable, without requiring developers to read tons of documentation and "Design patterns" in advance!
And, obviously, some universal json query language is needed
We tested it with pretty ad-hoc parameters (just to check if it's practical at all!), will soon write an automatic optimizer for them, minimizing query time.
The idea is that data in databases is organized in B-Trees, so we traverse those from a remote client. It is fast enough because usually only logarithmic fraction of a tree needs to be seen by the client.
The other is when the owner of the data is some group (like JP Chase). In this case we can have server-side quotas for handling cases when one or several clients are compromised. So, in this case it's more about distributing trust
The use case - any private data which you'd like to encrypt on the server while preserving ability to search. Medical records, financial data, emails are some examples.
Easier to say what this database is not for. Big data applications where you need to use a significant portion of data in the db (like 10%) in map-reduce queries is probably not what ZeroDB would be practical for.
We plan to make it a full-scale database. For that, we obviously require to have some convenient query language (similar or even compatible with Mongo's).
We've talked to original developers of ZODB and they (independently) suggested that having a language-independent query language is something they constantly thought of :-) In fact, it seems like many of them dream to take ZODB (or a db based on it ;-) where Mongo is now.
Though, observing access patterns, it could probably deduce which data belong to the tree and some info about ordering (which will hold true until we re-balance the tree, which happens on inserts).
I think, if we change objects each time we do queries, we can prevent this data leak.
Having the index end-to-end encrypted imposes some limitations though. You have to do several requests when you want to do one query which is obviously slower. Though, still practical.
And since the CPU logic happens on the client, in some cases (many simultaneous clients) the performance can be actually better.
But I think proper joins can be implemented with this idea
I find some ideas in MIT mOPE paper similar though
Very valid concern. That is the bottleneck, and that was the first thing we've checked.
> Isn't a lot of normal db server side operation now a fetch-from-db + do-calculation-on-client type operation?
Not if you want to find something. Calculation-on-client is probably html rendering etc.
> And a compromise client can still pull data by running query against the server right?
Yes, but it's ok if you have millions of users, each with his own private data. It would probably cost too much to break into each client's computer (imagine a million bitcoin wallers with 0.1 bitcoin each).
Currently available databases, when used with encryption, store the key in memory. So, memory dump or mitm attack could help an attacker to collect the key.