巴比特专栏 | 5分钟教你比特币私钥生成与保管的“银行级”方法
作者:汤强,原发于微信公众号:汤强(id:gainianditu),原题 《区块链资产进阶安全课》
区块链资产没有绝对安全一说。
私钥虽然不给别人看,但却是完全公开的,比如比特币私钥,只是一个在0到2的256次方之间的数,当然也别小看这个数,即使谁有当前人类算力的亿万倍,猜到宇宙毁灭,他能猜出一个私钥的概率也不到万亿分之一。
这是区块链资产安全的数学根基,而这同时也使保管数字资产不存在绝对的安全,但我们可以在相对层面想办法。
一、币到底应该放哪里?
放交易所?肯定是个办法,不过交易所关闭的风险始终存在。出了问题维权?可以的,但公安和法院不一定能找到它。
所以还得靠自己~
主流钱包是相对好的管理工具,但钱包文件容易丢失、密码容易被破、硬盘也容易损坏、旧电脑也容易被家人不小心当废品卖掉。
把私钥抄在纸上或者打印出来(纸钱包)还算保险,但随着时间推移,空气中的酸性物质会让墨水褪色、纸张碎裂,所以你还得考虑用无酸纸记录。但如果一场地震或火灾同时把密码纸、手机和电脑都烧了,那么要到哪里找回私钥?
你说可以多找几个地方存放备份,但衍生问题又来了:在哪里保管安全?分几份保管合适?——分开保管造成私钥泄露,那币可就丢了。
另外,随着区块链资产增值,现在1万元人民币的比特币,八年后增长到100万也不是没有可能,所以那时你还打算在一个地址上保管这些币?对了,目前为止,没有哪个交易所会把所有的币放在一个地址上。
深想下去你会发现,即使你目前掌控很小的比特币,你也必须进化出银行级的保管方法。
二、相对靠谱的私钥生成方法
如果有一种方法,能批量打印加密私钥就好了~比如:
批量生成加过密的展示私钥和地址,输出到文本文件,任由我们离线打印:
注意,这里的“展示私钥”比一般私钥(52位)多1位,所以并不是事实上的私钥,而是经过加密的。如果有人拿走了这张纸,他并不能直接依靠这里的私钥,转走你的币。
因为实际上的私钥是:把展示私钥的最后一位,替换掉序号后的那位字母。我们以第一条记录为例,
序号:3
展示私钥:L4F Q DnhczMkRsXn2QJyt8mccgcebGJdofGPExhndVw6MNDpT2Vy8 J
地址:1DskWSXjorfV9wgJkhufieFHaZJmuHHFRz
实际私钥是:用展示私钥的最后一位“J”,替换掉序号3的后一位,也就是第4位字母“Q”。所以实际私钥是:
实际私钥:L4F J DnhczMkRsXn2QJyt8mccgcebGJdofGPExhndVw6MNDpT2Vy8
实际私钥和展示私钥间的关系你自己知道就可以了。
- 脱离钱包工具
- 脱离上网环境
- 每次随机输出
纯离线独立操作坏境,天知地知你知其他人都不知。
首先要有Python3的环境,并且pip安装好bitcoin模块,如果你一下子理解不了下面的代码,可以参考上一篇文章 《Python:三行代码自制比特币私钥》 ,理解核心代码。
准备工作好后,直接复制粘贴下面这段代码到Python代码框,保存后按F5键运行。结果会以txt文本文件的形式,输出到你Python文件的默认路径下,供离线打印。
# 区块链资产进阶安全课
# 比特币私钥生成和保管的银行级方法
# 微信公众号:汤强
# 导入工具包
import
random
import
string
import
bitcoin
# 这里设置一口气需要出几个私钥
iter_num = 3
# 随机数生成函数————
# 生成一个由0和1组成的n位的字符串,n在这里设置为256,如01010100111……(共256位)
def
random_01
(n):
result = []
for
i
in
range(n):
i = random.randint(0,1)
result.append(i)
result_txt = [str(i)
for
i
in
result]
return
''.join(result_txt)
# 随机数处理函数————让随机之外还有随机
# 你可以在这步手动更改
def
dep_k_2
(k_2):
k_2 = k_2[:254] + str(random.randint(0,1)) + str(random.randint(0,1))
return
k_2
# 私钥集生成函数
# 转换路径:
# 1、加工后的256位二进制随机数k_2
# -> 2、等于k_2的十进制数k_10
# -> 3、私钥k -> 4、公钥K -> 5、地址A -> 6、加密私钥kk(用于显示)
def
prod_key
(iter_num):
for
i
in
range(iter_num):
# 生成一个1-50之间的整数,用于后续加密
random_int = random.randint(1,50)
# 生成256位的0和1组成的二进制字符串
k_2 = random_01(256)
# 进一步处理下上行代码生成的字符串,让随机更随机
k_2 = dep_k_2(k_2)
# 生成用于可公开打印的私钥随机字母r
# r的取值范围是26个大小写英文字母和10个阿拉伯数字
r = random.sample(string.ascii_letters + string.digits, 1)
if
len(str(k_2))==256:
# 检查字符是否是256位
k_10 = int('0b' + str(k_2), 2)
# 二进制数k_2转为十进制k_10
k = bitcoin.encode_privkey(k_10, 'wif_compressed')
# 生成私钥k
K = bitcoin.privkey_to_pubkey(k)
# 生成公钥K
A = bitcoin.pubkey_to_address(K)
# 生成地址A
# 生成打印私钥kk
kk = k[0:random_int]+ r[0] +k[random_int+1:52] + k[random_int]
# 生成可打印文本txt
txt = "序号:{}\n展示私钥:{}\n地址:{}\n".format(random_int, kk, A)
else
:
print('Not 256 bits')
# 若不是256位,则打印报错信息
# 生成打印文件,第二参数'a'代表追加
txt_file = open('key.txt', 'a')
# 打印到文件key.txt中
print(txt, file=txt_file)
# 关闭文件
txt_file.close()
# 整个文件需要执行的函数
if
__name__ == '__main__':
prod_key(iter_num)
具体的要点都在代码里作了注释,有Python经验的读者可以DIY专属你的代码。比如随机数处理函数(dep_k_2),可以略作改动,变化出属于你设定的随机,比如:
def
dep_k_2
(k_2):
k_2 = k_2[:253] \
+ str(random.randint(0,1)) \
+ str(random.randint(0,1)) \
+ str(random.randint(0,1))
return
k_2
这段代码的意思是:把原来自动生成的随机数最后三位截除后(只选前253位,这也是k_2[:253]的来历),然后添加三位随机数,让随机数更随机。当然这里并不是绝对的真随机,但用在离线加密私钥生成场景,是绝对足够了。
建议有能力的读者自己DIY一下dep_k_2()函数,否则黑客看到这篇文章,如果他了解Python中随机数的具体生成,会略微增加猜到的概率。
因为Python中随机数生成的逻辑是使用相关时刻作为种子。进一步DIY的方式同样可以参考 上一篇文章 。
当你试验十次导入私钥到钱包的操作成功、并且备份了一定数量的私钥纸后,你甚至可以直接把交易所的币转入对应的地址保存,完全脱离钱包和网络环境。
当你管理区块链资产的时候,你要把自己当成银行,因为在这个世界没有银行,只有你。
关于打印机不起眼的小提示,可以帮你向银行级的专业更靠拢一点。
三、清理打印机缓存文档
打印机打完私钥文件后,打印的内容可能不会马上消失,会存在缓存里。如果此时连网,还是有泄露文件的风险。虽然我们已经经过加密一环,但在保护私钥方面,我们不能有丝毫放松。
能删就删。
以Window系统为例:Win+R,或者左下角“开始”->“运行”,输入:
services.msc
在服务列表中找到Print Spooler的服务项,右键->“停止”。
同样Win+R调出运行窗口,输入:
spool
在出现的窗口中,删除PRINTERS文件夹
折返到服务列表,右键Print Spooler,点“启动”。
打印机缓存问题就解决了,再连网就更安全了。
结语
如果你决定佛系持币,私钥安全是第一要务。
此时此刻,比特币价格突破51,000美元,这只是一个开始。随着币价进一步波动,更为科学的管理方式是分散到更多地址,避免尾部风险。
如果你的持有量足够多,可以上调代码中iter_num的值,如:
iter_num = 10
一拆十,进一步摊薄风险。
当然,此时每次转账万分之五个币左右的矿工费也是你自己需要权衡的——不仅分拆时要支付一次,再转入交易所卖出时要再支付一次。不过这些费用和长期收益相比,已经是足够小了。
另外,打印私钥纸的份数、在哪里保管不会被火烧水淹,都是值得你思考的严肃问题,这个问题对所有人都很重要,但未必能引起每个人足够的重视。因为有了你DIY的加密函数,所以多打几份问题也不大,只要你自己牢记加密方式。
空投周报 | Magic Eden代币将于12月10日TEG;Side Protocol空投将于11月26日开放申领(11.18-11.24)
Telegram游戏Major拟于11月28日TEG;Suilend 公布代币经济学,空投占比40% 。
浅析区块链技术在全球选举和治理中的作用 | TrendX研究院
近年来,加密货币及其底层技术区块链在全球范围内引起了广泛的关注与讨论。从金融交易到政治治理,加密货币的影响力似乎正在逐步扩大。
下周必关注|WalletConnect开放空投申领;Ethena将敲定“费用开关”相关参数(11.25-12.1)
Starknet主网STRK质押功能将于11月26日启用。