GO语言-区块链离线钱包开发之如何存储私钥

这篇具有很好参考价值的文章主要介绍了GO语言-区块链离线钱包开发之如何存储私钥。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

# 如何存储私钥
在确保私钥安全的情况下,为了更好的体验,我们需要让钱包把私钥存储起来。给用户更好的体验感。Geth是将私钥通过加密技术转换为json格式的文件,这个文件虽然是明文的,但是解析它的时候需要密码,否则将无法解密。

在Geth中,使用`personal.newAccount("password")`,password就是密码。在keystore的文件中,我们可以看到一些关键元素。
- Address:账户地址信息
- Crypto:加密算法部分
  ```
  1、Cipher:对称加密
  2、Kdf:密钥生成函数
  3、Mac:验证密码的代码
  ```
- ID:uuid,系统内的唯一标识
- Version:版本号

## 定义hdkeystore包和结构
自定义一个HDkeystore结构体
```go
//HDkeystore使用的并非是私钥,它也是一个结构体,内部包含私钥
type HDkeyStore struct {
    keysDirPath string       //文件所在路径
    scryptN     int          //生成加密文件的参数N
    scryptP     int          //生成加密文件的参数P
    Key         keystore.Key //keystore对应的key
}
type Key struct{
 Id uuid.UUID
 Address common.Address
 PrivateKey *ecdsa.PrivateKey
}
```
## 生成UUID
借助rand加密包,生成uuid
```go
type UUID []byte

//全局加密随机阅读器
var rander = rand.Reader

//生成UUID
func NewRandom() UUID {
    uuid := make([]byte, 16)
    io.ReadFull(rand.Reader, uuid)
    //版本4规范处理与变形
    uuid[6] = (uuid[6] & 0x0f) | 0x40
    uuid[8] = (uuid[8] & 0x3f) | 0x80
    return uuid
}
```
## 编写HDkeystore构造函数
面向对象编程的通用思想
```go
//给出一个生成HDkeyStore对象的方法,通过privatekey生成
func NewHDkeyStore(path string, privateKey *ecdsa.PrivateKey) *HDkeyStore {
    //获得UUID
    uuid := []byte(NewRandom())
    key := keystore.Key{
        Id:         uuid,
        Address:    crypto.PubkeyToAddress(privateKey.PublicKey), //地址信息
        PrivateKey: privateKey,                                   //私钥信息
    }
    return &HDkeyStore{
        keysDirPath: path,
        scryptN:     keystore.LightScryptN, //固定参数
        scryptP:     keystore.LightScryptP, //固定参数
        Key:         key,
    }
}
```
## 写入文件实现
Keystore实际上是以太坊的一个接口,内部定义的三个方法都需要实现

### 实现StoreKey方法
存储key值
```go
//存储key为keystore文件
//StoreKey
func (ks HDkeyStore) StoreKey(filename string, key *keystore.Key, auth string) error {

    //编码key为json

    keyjson, err := keystore.EncryptKey(key, auth, ks.scryptN, ks.scryptP)

    if err != nil {
        return err
    }

    //写入文件

    return WriteKeyFile(filename, keyjson)

}
```
### 实现JoinPath方法
用于路径和文件拼接
```go
func (ks HDkeyStore) JoinPath(filename string) string {
    //如果filename是绝对路径,则直接返回
    if filepath.IsAbs(filename) {
        return filename
    }
    //将路径与文件拼接
    return filepath.Join(ks.keysDirPath, filename)
}
```
### 实现GetKey方法
keystore文件解析,形成私钥信息
```go

//解析key
func (ks *HDkeyStore) GetKey(addr common.Address, filename, auth string) (*keystore.Key, error) {
    //读取文件内容

    keyjson, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    //利用以太坊DecryptKey解码json文件
    key, err := keystore.DecryptKey(keyjson, auth)
    if err != nil {
        return nil, err
    }
    // 如果地址不同代表解析失败
    if key.Address != addr {
        return nil, fmt.Errorf("key content mismatch: have account %x, want %x", key.Address, addr)
    }
    ks.Key = *key
    return key, nil
}
```文章来源地址https://www.toymoban.com/news/detail-591540.html

到了这里,关于GO语言-区块链离线钱包开发之如何存储私钥的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Java的Android区块链钱包开发(ETH篇)

    首先要生成12个助记词,区块链开发之生成12个助记词

    2024年02月11日
    浏览(61)
  • 区块链钱包开发(Android篇),Android程序员必会

    布隆过滤器(Bloom Filter):过滤掉那些不包含有目标地址的交易信息,这一步能避免掉大量不相关的数据下载。 创建区块链 //创建区块链文件 File blockChainFile = new File(getDir(“blockstore”, Context.MODE_PRIVATE), “blockchain”); //创建SPVBlockStore,管理区块数据 blockStore = new SPVBlockStore(Co

    2024年04月09日
    浏览(85)
  • 区块链钱包开发(Android篇),深入解析android核心组件和应用框架

    作用: 1、备份更容易。按照比特币的原则,尽量不要使用同一个地址,一个地址只使用一次,这样会导致频繁备份钱包。HD钱包只需要在创建时保存主密钥,通过主密钥可以派生出所有的子密钥。 2、私钥离线更安全。主私钥离线存储,主公钥在线使用,通过主公钥可以派生

    2024年03月24日
    浏览(45)
  • 【区块链技术开发语言】在ubuntu18 系统环境下命令操作配置以太坊go-ethereum环境

    项目简介: 以太坊是一个基于区块链技术的分布式平台,用于构建去中心化应用程序(DApps)。go-ethereum 是以太坊官方开发团队维护的 Go 语言实现的以太坊客户端,也被称为 Geth。它提供了一个完整的以太坊节点,用于参与以太坊网络,执行智能合约,进行交易等。 前提条件

    2024年02月21日
    浏览(45)
  • 在使用go语言开发的时候,程序启动后如何获取程序pid

    在Go语言中,标准库并没有直接提供获取进程ID(PID)的函数。通常,你可以使用os包和syscall包来调用底层的操作系统函数来获取PID。 以下是一个获取程序PID的示例代码: 在这个示例中,os.Getpid() 返回当前进程的PID。另外,syscall.Getpid() 也提供了相同的功能。 请注意,这种方

    2024年01月20日
    浏览(48)
  • go语言简单实现区块链

            在本文中,我们将使用Go语言来实现一个简单的区块链系统,包括区块生成、交易处理和区块打印、保存区块链等功能。 在开始之前,先确保计算机上安装了以下内容: Go编程语言:您可以从Go官方网站下载并安装Go。 Go开发环境:设置Go开发环境,包括文本编辑器

    2024年04月16日
    浏览(38)
  • go语言--区块链学习(一)

    温馨跳转链接:模块二:go语言–区块链学习(二)-CSDN博客 1.1 密码介绍 1.1.1 为什么要加密 ? 保护隐私和数据安全:在信息传输过程中,不加密的数据可以被未经授权的人员截获和查看,这可能导致个人隐私泄露、商业机密被窃取或者敏感数据被篡改。通过加密数据,可以

    2024年01月21日
    浏览(42)
  • GO语言-生成区块链账户地址

    持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情 为了收款方便,用户需要对外公布一个地址,这个地址其实是公钥经过一系列变化得来的。比如:比特币公钥到地址的变化过程,一个公钥经过SHA256+RIPEMD160两次叠加运算得到公钥

    2024年01月23日
    浏览(45)
  • Go语言Blockchain与区块链

    区块链技术是一种分布式、去中心化的数字账本技术,它允许多个节点共同维护一个共享的、有序的、不可篡改的数据库。区块链技术的核心概念是通过加密技术和分布式共识算法来确保数据的安全性、完整性和可靠性。 Go语言是一种静态类型、垃圾回收、并发简单的编程语

    2024年02月20日
    浏览(41)
  • 使用Go语言搭建区块链基础

    随着区块链技术的发展,越来越多的人开始关注并使用这一技术,其中,比特币和以太坊等区块链项目正在成为人们关注的焦点。而Go语言作为一种高效、简洁的编程语言,越来越多的区块链项目也选择使用Go语言来搭建其底层基础。本文将介绍如何使用Go语言搭建区块链的基

    2024年02月04日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包