当前位置:首页 > 技术分析 > 正文内容

一种中心化交易平台的私钥管理思路

ruisui883周前 (05-24)技术分析19

中心化的数字藏品交易平台需要为每一个用户生成私钥,这样才能在铸造和交易成功时,将数字藏品存入对应的账户地址中。

生成一个私钥的方法

pbkdf2.Key() 生成秘钥函数

PBKDF2(Password-Based Key Derivation Function) 是一个用来导出密钥的函数,常用于生成加密的密码。

它的基本原理是通过一个伪随机函数(例如HMAC函数、sha512等),把明文(password)和一个盐值(salt)作为一个输入参数,然后重复进行运算,并最终产生秘钥。

如果重复的次数足够大,破解的成本就会变得很高。而盐值的添加也会增加“彩虹表”攻击的难度。

用户密码采用 PBKDF2 算法存储,比较安全。

PBKDF2函数的语法定义

```

DK = PBKDF2(PRF, Password, Salt, c, dkLen ,Hash algorithm)

```

- PRF是一个伪随机函数,例如HASH_HMAC函数,它会输出长度为hLen的结果。

- Password是用来生成密钥的原文密码。

- Salt是一个加密用的盐值。

- c是进行重复计算的次数。

- dkLen是期望得到的密钥的长度。

- DK是最后产生的密钥。

以下为使用助记词生成私钥的代码

```golang

package pbkdf2

import (
	"crypto/rand"
	"crypto/sha512"
	"golang.org/x/crypto/pbkdf2"
)

const (
    Mnemonic =  "blood twenty adjust search crime conversation tag directory joke leaf express interest"
    password = ""
)
func encryptPwdWithSalt(password string) (*ecdsa.PrivateKey, *ecdsa.PublicKey) {
		seed := pbkdf2.Key([]byte(Mnemonic), []byte("mnemonic"+password), 2048, 64, sha512.New)
}

// []byte(Mnemonic):助记词
// []byte("mnemonic"+password) :salt盐值
// 2048:重复计算的次数
// 64:返回的秘钥长度
// sha512.New:哈希算法

```

HMAC 生成摘要算法

HMAC算法中文名称叫哈希消息认证码,英文全称是Hash-based Message Authentication Code。它的算法是基于某个哈希散列函数(主要是SHA系列和MD系列),以一个密钥和一个消息为输入,生成一个消息摘要作为输出。HMAC算法与其他哈希散列算法最大区别就是需要有密钥。它的算法函数是利用分组密码来建立的一个单向Hash函数。

HMAC的密钥可以是任何长度,如果密钥的长度超过了摘要算法信息分组的长度,则首先使用摘要算法计算密钥的摘要作为新的密钥。一般不建议使用太短的密钥,因为密钥的长度与安全强度是相关的。通常选取密钥长度不小于所选用摘要算法输出的信息摘要的长度。

HMAC算法golang封装的代码详细解析

```golang

//创建运算对象,HMAC需要两个参数:hash函数和key
hmac := hmac.New(sha512.New, []byte(BitcoinSeed))
//将明文写入到hmac中
	_, err := hmac.Write([]byte(seed))
	if err != nil {
		return nil, nil
	}
//hmac对象对写入数据的运算,生成的参数为字节	
intermediary := hmac.Sum(nil)

```

PrivKeyFromBytes 创建私钥、公钥对

```golang

// PrivKeyFromBytes 根据私钥随机数D返回公私钥
func PrivKeyFromBytes(curve elliptic.Curve, pk []byte) (*PrivateKey, *PublicKey) {
	// 根据字节pk,返回x,y
	x, y := curve.ScalarBaseMult(pk)
	// 定义一个私钥结构体,结构体中包含:公钥结构体
	priv := &PrivateKey{
		PublicKey: e.PublicKey{
			Curve: curve,
			X:     x,
			Y:     y,
		},
		D: new(big.Int).SetBytes(pk),
	}
	return priv, (*PublicKey)(&priv.PublicKey)
}

```

用这个函数来创建私钥

```golang

	keyBytes := intermediary[:32] // 私钥
	return ecdsa.PrivKeyFromBytes(ecdsa.S256(), keyBytes)

```

全部代码

```golang

func NewKey(mnemonic, password string) (*ecdsa.PrivateKey, *ecdsa.PublicKey) {
	seed := pbkdf2.Key([]byte(mnemonic), []byte("mnemonic"+password), 2048, 64, sha512.New)
	hmac := hmac.New(sha512.New, []byte(BitcoinSeed))
	_, err := hmac.Write([]byte(seed))
	if err != nil {
		return nil, nil
	}
	intermediary := hmac.Sum(nil)
	keyBytes := intermediary[:32] // 私钥
	return ecdsa.PrivKeyFromBytes(ecdsa.S256(), keyBytes)
}

```

生成多个私钥的方法

上诉参数中有 password 作为参数。这里把数据库里的id作为参数传入。每次都是用相同的方法,则生成的私钥是一定的。有多少用户,就能生成多少个私钥。

此时只保存原始的 mnemonic 即可。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/4314.html

标签: pbkdf2算法
分享给朋友:

“一种中心化交易平台的私钥管理思路” 的相关文章

vue3中父子传值、defineProps用法、defineEmits用法

Vue3中新增了一个 script setup 语法糖模式,可以在单文件组件中更简洁地编写组件逻辑。使用 script setup 语法后,props、data、computed、methods 等选项不再需要独立定义,而是可以直接在 setup 函数中声明,代码结构更加清晰,并且可以更方便地使用响...

22《Vue 入门教程》VueRouter 路由嵌套

1. 前言本小节我们介绍如何嵌套使用 VueRouter。嵌套路由在日常的开发中非常常见,如何定义和使用嵌套路由是本节的重点。同学们在学完本节课程之后需要自己多尝试配置路由。2. 配置嵌套路由实际项目中的应用界面,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层...

vue.js 双向绑定如何理解,有什么好处!#云南小程序开发

Vue.js 的双向数据绑定是借助于 JavaScript 的一些特性,如对象的属性 getter 和 setter 以及 Vue 的依赖追踪系统实现的。简单来说,双向数据绑定就是数据与视图间的双向通信,也就是说数据的改变会马上反映到视图中,视图的改变也会立刻改变数据。具体来说,当你改变了数据时,视...

尤雨溪:Vue 2生命周期已正式结束,开发团队应迁移至最新版本

IT之家 1 月 2 日消息,Vue.js 作者尤雨溪发文声称,Vue 2 已于 2023 年 12 月 31 日结束生命周期(EOL),目前 Vue 2 已经无法接收到新功能及修复补丁,还在使用 Vue 2 的开发团队应迁移至最新的 Vue 3 版本。据悉,Vue 2.0 最初发布于 2016 年...

突发!微信全面封禁字节跳动旗下办公产品飞书

日前,字节跳动旗下办公套件飞书发布官方公告称,飞书相关域名无故被微信全面封禁,并且被单方面关闭微信分享API接口。和讯科技对此进行了尝试,发现“feishu”相关域名链接在微信内均无法打开,显示“如需浏览,请长按网址复制后使用浏览器访问”,而在飞书内也无法直接跳转微信分享,显示“未获得分享权限”。据...

Linux TCP RST情况

导致“Connection reset”的原因是服务器端因为某种原因关闭了Connection,而客户端依然在读写数据,此时服务器会返回复位标志“RST”,然后此时客户端就会提示“java.net.SocketException: Connection reset”。可能有同学对复位标志“RST”还...