I'm currently creating a "Google Docs" alternative using Symfony, but made for privacy. To "certify" the confidentiality of user data, I'm interested in the "Zero-Access" infrastructure.
If I understand correctly, the concept is that the client encrypts/decrypts data with a key based on the password and the server stocks encrypted data. It's better for security and privacy and certify that the website cannot use data for tracking/advertising.
Is it right?
The concept is interesting but I found 2 problems:
For the first problem, I found a solution: the "userAccess" entity (STR user_id, STR doc_id, INT permission) stock the file key encrypted by the user key, the client can decrypt this key then decrypt/encrypt the file.
For the second problem, I don't have any solution...
Here some questions:
Is my "Zero-Access" definition right?
Is my answer to the first problem true?
Is there any solution to the second problem?
I'll try to answer your questions:
I am not familiar with the "Zero-Access" term you are using. However, what you describes looks like End-to-end encryption to me, meaning data are only decrypted on clients.
Regarding your first solution, it is indeed how it is usually done in that case. You could be interested in reading what the Signal application does to encrypt chats, in particular the Sesame algorithm (see here)
Finally, there is no way to recover encrypted data if the encryption key is lost, so (for instance, firefox resets your data but provides recovery keys. One could guess these keys act like an other password)
Hope that helps!