Best practices for saving encrypted user data without a database We are setting up a web application which requires users to submit sensitive data. Since entering all the required data may take a long amount of time, we want to give them the option to save their progress. Maintaining a database to store their information is risky for us, as it opens up our servers to potential attacks. We have a small team and would be hard pressed to maintain the level of security we would want.

Rather than maintaining such a database, we would like to encrypt the user's partial progress (a text string in JSON format) with a password that we provide and that is supplied to them only at the time they wish to save progress. They will be instructed in the UI to physically write the password down rather than save it on their computer. To resume progress, they would supply us the encrypted file and the password. On our end, no data is persisted. If they lose the password they just have to start again. 

Is any portion of this method obviously insecure? What encryption algorithms and libraries (Java or Python) are best for performing encryption/decryption?
This answer proposes a solution based on local storage and local encryption.

The data of the forms that the user enters:


Can be locally encrypted whenever the user wants to save...
The encrypted file(s) can be stored locally, if you want to store it to, you can transfer a copy to your server
The encrypted file(s) can be decrypted locally and restored into forms by JScript. You can use NodeJS.
If the user lost their file(s) then if you saved in your server, you can transfer back to the user to resume.


The methods;


From a password to an encryption key, you can use PBKDF2. Ask the user to a good password to increase against the brute-force attacks. 
For encryption of the data, you can use AES-CBC with randomly generated IV. If you want to authentication for the encrypted data, you should, you can use AES-GCM.


Don't forget to ask the user to write the password at somewhere.