A non-transitory computer-readable storage medium comprising instructions that, when executed by at least one processor of a machine, cause the machine to perform operations comprising:
- receiving a data object from the first user;
- receiving a private key of the first user;
- receiving identification information about the first user and a password from the first user, wherein the information and the password are received by way of a log in page;
- retrieving a public key of a user specifically permitted to view the data object;
- encrypting the data object using an object key;
- wrapping the object key with a paired key generated using the private key of the first user and the public key of the user specifically permitted to view the data object;
- storing the encrypted data object with the wrapped object key;
- receiving a request to access the encrypted data object from a second user;
- obtaining a private key of the second user;
- unwrapping the object key using a duplicate key computed from the private key of the second user and a public key of the first user a key providing a decryption key to decrypt the encrypted data object using key information from the first user and key information from the second user;
- decrypting the encrypted data object using the object key;
- and
- providing the decrypted data object to the second users;
- receiving information indicating user identification from the second user;
- and
- receiving a password associated with the information indicating user identification from the second user, and
- providing other decrypted data objects provided by the first user to the second user when permitted by the first user after receiving the information indicating user identification from the second user and the associated password.