I didn't see any direct issues. Single round hashing is good and needing the deck sort of makes this like a two factor system but single round of a fast function like SHA-256 isn't ideal for hashing password. Brute forcing passwords is easier for an attacker because a single attempt is so quick. That is why I suggested a KDF such as PBKDF as it would provide additional security against moderately weak passwords (key stretching). Still that is only a suggestion.
As an user option you may want to consider allowing the user to enter a deck and select to output a
BIP32 BIP-39 mnemonic seed. This would provide a convenient way to generate (without using a PRNG) and backup any wallet which uses BIP-39 seeds (such as trezor). Not everyone trusts PRNGs but generating a seed from cards, dice, or coins manually can be confusing. An app which makes it easy to take a deck of cards and produce a secure high entropy seed would be useful. I would recommend it (if verifiable).
Regarding the single round hashing I chose that method to make it compatible with brain wallets. That way users can get their coins even without the app (although the process is much more complicated of course). They can just write their password followed by the card ordering (ex:
myPassword4CTS9D...KHQSAH) and get the address
here. By far the main security feature is the card ordering, not the password, in fact the later is optional. An attacker would need to have the actual deck of cards to even try brute forcing the password if set. I consider the password as a 2FA and not the other way around.
I like the BIP-39 mnemonic idea very much. I will definitely implement that when I have some time. I'd also like the app to allow either generating/exporting the master public key (for deposits and balance checking), the list of the first X addresses, the actual mnemonic or an individual private key for a single address. This way even if a single address is redeemed the whole wallet doesn't have to be discarded because the mnemonic and the other keys have never been online.
Regarding your last phrase (if verifiable), I do want to make sure it is 100% verifiable. The current measures I've taken are:
- Code is open-source.
- Published app is not obfuscated, so it can be de-compiled.
- No access to Internet.
Any other recommendations to make it verifiable?
Most probably I'll add 2 modes in settings: "Brain wallet" (as it is working now) and "BIP-39" (which would be the default option).