答案先抛
技术上完全可以,但绝大多数自制方案都死在"随机性"这一关。人脑、生日、电话号码、SHA-256("我自己想的一句话")——这些都不是合格的熵源。攻击者运行的扫描脚本,会把所有英文短语、流行密码、Bible 段落、Linux 字典全部哈希一遍,几秒内把你"自己想的"私钥扫光。如果一定要手动生成,靠谱方法是用物理随机源:掷一枚公平硬币 256 次,或用密码学骰子掷 99 次。
为什么是这样
私钥的安全性根基是 256 位随机数。"随机"在密码学里有严格定义:每一位 50/50 概率、互相独立。人脑生成的"随机"远远达不到——心理学研究发现,让人说一串数字时会无意识避开重复、偏好奇数、回避边缘数字。这些偏差让搜索空间从 2 的 256 次方缩小到几十万级别。
这件事在 2013-2017 年的 brain wallet 风潮里有过血淋淋的实例。当时有个网站叫 brainwallet.org,让用户输入一句"自己记得住的话",SHA-256 后变成私钥。攻击者扫了维基百科、流行歌词、Bible 章节、Reddit 论坛分享。几年下来 brain wallet 损失估计超 2500 万美金,被搬空的地址数以万计。
更隐蔽的陷阱是"自己写算法"。有人用当前时间戳作随机种子调用语言内置函数生成 256 位——时间戳搜索空间是秒级的几十亿,一台电脑几小时就能扫完。Python random、JavaScript Math.random() 都不是密码学安全源。
合格做法只有两种。一是用钱包默认调用了 /dev/urandom 的生成流程;二是物理熵源——256 次硬币翻面或 99 次骰子。Trezor、ColdCard 都内置"骰子模式"。
常见误解 / 注意点
- "brain wallet" 现在还是死路——任何把人类记忆当熵源的方案都不安全。攻击者扫的不是你这一句,是所有人类语言的所有句子。
- 用骰子的话必须是密码学骰子(每面磨边精确)。普通游戏骰子 0.5-2% 偏差,多次叠加压缩熵。GameScience 骰子几十美金。
- 不要"键盘随便敲几下当熵"——按键时间间隔在毫秒级有可预测规律。
- 不放心厂家随机源(合理怀疑),最稳的是 Trezor T 或 ColdCard 的骰子模式,断网完成。
关联阅读
256 位随机数的物理意义和 /dev/urandom 的工作原理,在 《私钥与助记词 · 加密世界的身份证》 第二节"私钥到底是什么"详细解释过。如果你想看真实案例,《私钥泄露应急》 第一章有 brain wallet 损失的几个具体地址。