1
I am planning on building a small e-wallet website to learn the basics of encryption and handling accounts, transactions, and balances in Bitcoin.
I want to learn how to make a website where the database does not hold anyone's private data.
What client-side encryption and hashing algorithm should I use? What algorithm or process should I use to ensure that the users encrypted and hashed data is secure on the server?
Using brainwallet, the process for account creation is this:
- The client creates a private key.
- The user enters a username/password
- The client encrypts the private key with a password. The client hashes the password and username. The client sends data to the server.
- The server stores the hashed username/password and encrypted private key to the database.
Now, whenever a user wishes to spend a transaction on my site, I am attempting to use brainwallet to send transactions. The process for this will be:
- The user types in a username and password.
- The client sends a hashed username/password to the server.
- The server responds with an encrypted private key for that user.
- The client decrypts the private key with a password.
As a side note: is this a sound process for storing and transmitting data to the server?
The brainwallet code I linked is not an actual brain wallet, it's a javascript implementation of address generation and transaction creation/signing. I think that the security gained from storing an encrypted private key rather than a plaintext private key is significant. At the end of the day, if a user is going to use a webwallet, they'll choose blockchain.info over any competitor who has access to their private key in plaintext. – bvpx – 2013-09-29T22:52:45.013
Blockchain.info has access to the private keys anyway, you would have to be a fool to believe otherwise. If not them, someone with root on their boxes, or someone at cloudflare, or the janitor at the datacenter. JavaScript based crypto, can not and will not ever be secure when the code protecting the data is being loaded from a possibly adversarial server. Even if there wasn't a backdoor (I'm not saying there is), any JS encryption is weak and slow, compounded by the fact that users choose bad passwords. Better to just forgo the veil of false security, and store the keys server side. – Anonymous – 2013-09-29T23:26:59.560