当前位置: 首页 > news >正文

如何生成和安全保存私钥?

一、私钥生成的核心原理

私钥是256位(32字节)的随机数,必须通过密码学安全随机数生成器(CSPRNG)生成。以下是技术实现与示例:

1. 生成私钥的代码示例(Python)

python

import os
# 使用CSPRNG生成32字节私钥
private_key_bytes = os.urandom(32)
private_key_hex = private_key_bytes.hex()
# 验证私钥格式
assert len(private_key_hex) == 64, "私钥长度应为64个十六进制字符"
print(f"生成私钥(十六进制): {private_key_hex}")

输出示例

生成私钥(十六进制): 958a510fd5c37dcca362b8580784ad54940138fb40b33c6327e562449e2710c1

2. 关键安全要求

  • 随机性:必须使用CSPRNG(如os.urandom),避免使用伪随机数生成器(如random模块)。
  • 长度:严格为32字节(256位),任何缩短或延长都会导致无效私钥。
  • 唯一性:每个私钥必须全球唯一,避免碰撞风险。

二、私钥的安全保存方法

私钥一旦丢失或泄露,资产将永久丢失。以下是主流保存方案及操作步骤:

1. 助记词(BIP39标准)

  • 原理:将私钥转换为12-24个单词的助记词,通过密码学算法(PBKDF2)恢复私钥。
  • 操作步骤
    1. 生成熵:使用CSPRNG生成128-256位熵(如128位对应12个单词)。
    2. 转换为助记词:通过SHA-256哈希生成校验和,并将熵+校验和映射为单词列表。
    3. 备份:将助记词手写或打印在纸上,存放在防火防水容器中。

示例代码(生成助记词)

python

import os
import hashlib
import bisect
# BIP39单词表(简化版)
BIP39_WORDLIST = ["abandon", "ability", "able", ...] # 完整列表需2048个单词
# 生成128位熵
entropy = os.urandom(16)
entropy_hex = entropy.hex()
# 计算校验和(SHA-256前1位)
sha256_hash = hashlib.sha256(entropy).hexdigest()
checksum = bin(int(sha256_hash, 16))[2:].zfill(256)[0:4] # 取前4位(128位熵对应1位校验)
# 转换为二进制并分割为11位块
entropy_bits = bin(int(entropy_hex, 16))[2:].zfill(128)
entropy_bits += checksum
mnemonic_bits = [entropy_bits[i*11:(i+1)*11] for i in range(12)]
# 映射为助记词
mnemonic = [BIP39_WORDLIST[int(bit, 2)] for bit in mnemonic_bits]
print(f"助记词: {' '.join(mnemonic)}")

2. Keystore文件(加密私钥)

  • 原理:将私钥用强密码加密后存储为JSON文件,需密码解密方可使用。
  • 操作步骤
    1. 生成Keystore:使用PBKDF2算法对私钥和密码进行多次哈希,生成加密密钥。
    2. 存储:将加密后的私钥、盐值(salt)、迭代次数(iterations)等参数保存为JSON文件。
    3. 使用:输入密码解密Keystore文件,恢复私钥。

示例代码(生成Keystore)

python

import os
import json
import hashlib
import base64
# 私钥和密码
private_key_hex = "958a510fd5c37dcca362b8580784ad54940138fb40b33c6327e562449e2710c1"
password = "StrongPassword123!"
# 生成盐值(16字节)
salt = os.urandom(16)
salt_hex = salt.hex()
# 使用PBKDF2生成加密密钥(10000次迭代)
dk = hashlib.pbkdf2_hmac(
'sha256',
password.encode(),
salt,
10000,
dklen=32
)
encryption_key = dk.hex()
# 加密私钥(XOR操作,示例简化)
private_key_bytes = bytes.fromhex(private_key_hex)
encrypted_bytes = bytes([p ^ k for p, k in zip(private_key_bytes, dk)])
encrypted_hex = encrypted_bytes.hex()
# 生成Keystore文件
keystore = {
"crypto": {
"cipher": "aes-128-ctr",
"cipherparams": {"iv": "8f2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d"}, # 示例IV
"ciphertext": encrypted_hex,
"kdf": "pbkdf2",
"kdfparams": {
"dklen": 32,
"salt": salt_hex,
"n": 10000,
"c": 1,
"prf": "hmac-sha256"
},
"mac": hashlib.sha256(dk + encrypted_bytes).hexdigest()
},
"id": "uuid-v4",
"version": 3
}
with open("keystore.json", "w") as f:
json.dump(keystore, f, indent=4)
print("Keystore文件已生成: keystore.json")

3. 物理备份(冷存储)

  • 手写备份:将私钥或助记词手写在耐久性强的纸上,避免使用电子设备。
  • 金属备份:将私钥刻在不锈钢或钛合金板上,抵抗火灾和水灾。
  • 多地点存放:将备份分散存放在不同安全地点(如银行保险箱、家中隐蔽处)。

4. 硬件钱包(专用设备)

  • 原理:使用专用硬件(如Ledger、Trezor)生成和存储私钥,私钥始终不离开设备。
  • 操作步骤
    1. 购买硬件钱包:选择经过安全审计的知名品牌。
    2. 初始化设备:通过设备屏幕和按钮生成私钥,设置PIN码。
    3. 备份助记词:将设备生成的助记词按顺序抄写并保存。
    4. 使用设备:通过USB或蓝牙连接电脑,签名交易时需设备物理确认。

三、安全保存的核心原则

  1. 离线存储:私钥或助记词必须存放在未连接互联网的设备或介质中。
  2. 多重备份:至少保留3份备份,分散存放在不同物理位置。
  3. 加密保护:对数字化备份(如Keystore文件)使用强密码加密。
  4. 定期验证:每6-12个月检查一次备份的可访问性和完整性。
  5. 避免暴露:切勿将私钥或助记词拍照、截图或通过电子邮件发送。

四、总结

方法安全性便捷性适用场景
助记词长期存储、手动备份
Keystore数字化备份、需密码管理
物理备份极高冷存储、抵抗物理灾害
硬件钱包最高大额资产、频繁交易

最终建议

  • 小额资产:使用去中心化钱包(如MetaMask)结合硬件钱包签名。
  • 大额资产:优先使用硬件钱包,并配合物理备份和助记词多重加密。
  • 避免:将私钥存储在云服务、电子邮件或交易所中,防止黑客攻击或平台跑路风险。
http://www.dtcms.com/a/338340.html

相关文章:

  • oracle dg duplicate限速
  • 区块链技术原理(16)-以太坊节点与客户端
  • SpringBoot--JWT
  • WPF 打印报告图片大小的自适应(含完整示例与详解)
  • 初识CNN04——经典网络认识
  • 驱动开发系列64 - glCompileShader实现-GLSL 精度优化pass
  • 3.1 结构化输出(大模型的封闭与开放)
  • Windows系统上使用GIT
  • CMake指令:查找文件(find_file)、查找目录(find_path)、查找库文件(find_library)
  • Life:Internship in OnSea Day 57
  • 【Kubernetes】在 K8s 上部署 Prometheus
  • 1-Flask相关知识点
  • 恒创科技:日本服务器 ping 不通?从排查到解决的实用指南
  • 朝阳区24小时图书馆“焕新计划”启幕 文化讲座点亮夜间阅读之光
  • ST05跟踪MRP的运行(MD01)过程
  • 使用chmod 命令修改文件权限
  • 【完整源码+数据集+部署教程】空中目标检测系统源码和数据集:改进yolo11-UniRepLKNetBlock
  • mac 电脑安装类似 nvm 的工具,node 版本管理工具
  • 【机器人-基础知识】ROS2常用命令
  • Vue3 全新特性 defineModel 深度解析
  • CentOS Linux 7 (Core)上部署Oracle 11g、19C RAC详细图文教程
  • 【MySQL】超详细入门学习
  • vue3 + antd modal弹窗拖拽全局封装 使用useDraggable
  • LeetCode100 -- Day1
  • 嵌入式工程师常去的网址
  • 缺陷检测最新综述:针对现实世界工业缺陷检测的综合调查:挑战、方法与展望
  • C++对象的内存布局
  • 拓扑排序详解:从力扣 207 题看有向图环检测
  • 2025年最新美区Apple ID共享账号免费分享(持续更新)
  • 决策树(1)