The approach below is very flexible because it applies not only to Ethereum but other cryptos as well that follow the BIP 32,39 and 44 Hierarchical Deterministic (HD) wallet standards. Because the BIP 39 Mnemonic conversions inherently applies Password Based Key Derived Function 2 (PBKDF2) that uses 2048 rounds of HMAC-SHA512 hashing that will partially compensate for poorly chosen brain wallets with little entropy.
Obviously, your brain wallet phrase, your BIP 39 seed words, and your BIP 39 Passphrase should be kept private, and all operation should be performed on an offline trusted computer.
Step 2 calculates the BIP 44 private key path for Ethereum, m/44'/60'/0'/0/0.
Results for Step 3 can be easily validated by configuring a Trezor with the BIP 39 seed words provided below and a BIP 39 Passphrase. (Ledger wallets use a different non-standard HD path for Ethereum.)
1. Computing BIP 39 seed words from from what should be a complex brain wallet:
% echo -n "This is how you can create a BIP 39 brain wallet that is applied to Ethereum" | bx base16-encode | bx sha256 | bx mnemonic-new
game bless rather reward fun person negative manage walnut blanket normal swamp glue garbage deer flip immense assault sponsor matter ethics scare cushion loop
See mnemonic-new for details for using bitcoin-explorer commands.
2. Computing the first of billions of Ethereum HD Wallet Private Keys, m/44'/60'/0'/0/0:
% echo "game bless rather reward fun person negative manage walnut blanket normal swamp glue garbage deer flip immense assault sponsor matter ethics scare cushion loop" | bx mnemonic-to-seed -p "Your private HD Passphrase" | bx hd-new | bx hd-private -d -i 44 | bx hd-private -d -i 60 | bx hd-private -d -i 0 | bx hd-private -i 0 | bx hd-private -i 0 | bx hd-to-ec
3. Computing the associated address for the private key:
% echo -n 469225ff5a9fe8eea420568657792a2a1beb313db2dba607bdc59661f058c376 | bx ec-to-public -u | sed 's/^..//' | ./kec | cut -c 25-64