You might be able to "enjoy both worlds" in the following sense:
Assuming that the server doesn't need to know the actual contents of the passwords you can employ the following scheme:
- The client generates a client key for the password
- The client encrypts the password via said key
- The client uploads the client encrypted password to the server
- The server, before storing this ciphertext in the DB, also generates a key and
- The server encrypts the password with this independent, server generated key
- The server stores the password in the DB which is doubly encrypted (first via client key, then via server key)
- Needless to say, before the server sends a password to the user, it will need to remove its own layer of encryption (=decrypt) via using the same key it generated.
Now, perhaps the most important point which is relevant to the security of this entire setup, is that the client key/s should be protected via a passphrase that the client must enter whenever he wants to access a password. Ideally, the program should be written so that the client key/s are always stored encrypted and get decrypted only in volatile memory after the appropriate passphrase has been entered. You can then derive a "main client key" from this passphrase...
This is only a rough sketch of how to tackle this, and a lot more can be done to improve this probably. For example if you're talking about Windows in particular, you can employ DPAPI and in some scenarios it can replace the passphrase...
Important comment: whenever I wrote "generate a key" it also means that you need to store this key somewhere, since those are long term keys (used for encryption of what is, eventually, persistent data in the form of a password, as opposed to transient keys which are employed for example, for communication...)