golang笔记-区块链密码学01

2023-11-03

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是最后产生的密钥。

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

package pbkdf2

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

const (
    Mnemonic =  "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函数。
下表显示具体的算法对应输出摘要的长度。

算法 摘要长度(位) 备注
HmacMD5 128 BouncyCastle实现
HmacSHA1 160 (20个字节) BouncyCastle实现
HmacSHA256 256 BouncyCastle实现
HmacSHA384 384 BouncyCastle实现
HmacSHA512 512 JAVA6实现
HmacMD2 128 BouncyCastle实现
HmacMD4 128 BouncyCastle实现
HmacSHA224 224 BouncyCastle实现

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

HMAC算法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)

用golang使用HMAC算法的距举例

package main

import (
    "crypto/hmac"
    "crypto/md5"
    "crypto/sha1"
    "encoding/hex"
    "fmt"
)

func Md5(data string) string {
    md5 := md5.New()
    md5.Write([]byte(data))
    md5Data := md5.Sum([]byte(""))
    return hex.EncodeToString(md5Data)
}

func Hmac(key, data string) string {
    hmac := hmac.New(md5.New, []byte(key))
    hmac.Write([]byte(data))
    return hex.EncodeToString(hmac.Sum(nil)
}

func Sha1(data string) string {
    sha1 := sha1.New()
    sha1.Write([]byte(data))
    return hex.EncodeToString(sha1.Sum(nil))
}

func main() {
    fmt.Println(Md5("hello"))
    fmt.Println(Hmac("key2", "hello"))
    fmt.Println(Sha1("hello"))
}

PrivKeyFromBytes 创建私钥、公钥对

根据作为参数作为字节切片传递的私钥返回“曲线”的私钥和公钥。

我们应该知道,可以从私钥生成公钥。所以拥有私钥相当于拥有整个密钥对。

以下为生成密钥对的代码:

func PrivKeyFromBytes(curve elliptic.Curve, pk []byte) (*PrivateKey, *PublicKey) {
	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)
}

*ecdsa.PrivateKey 是 PublicKey 和 PrivateKey 的结构。这也是从原始字节 PrivateKey 检索密钥对的函数。

参考文档

  • PBKDF2算法:https://segmentfault.com/a/1190000004261009
  • 比特币btcd源码:https://github.com/btcsuite/btcd/blob/master/btcec/privkey.go
  • btcd包:https://pkg.go.dev/github.com/btcsuite/btcd/btcec#PrivKeyFromBytes
  • 理解btcd:https://hlongvu.com/post/z2hvvdr6wb-Understanding-btcd-Part-2-Key-and-Address
  • 区块链密码学:https://www.chaindesk.cn/witbook/15/230

以上,就是今天分享的全部内容了,希望大家通过以上笔记可以解决自己的实际需求,解决自己目前所遇到的问题。

如果文章中有不太正确的地方,欢迎指正,可以扫描下面的二维码,添加我的个人微信,备注:地区-职业方向-昵称,欢迎来撩,加入golang技术交流群,与更多的golang开发者、技术大佬学习交流。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang笔记-区块链密码学01 的相关文章

  • VSCode 下python输出中文乱码问题

    在处理这个问题之前 你首先得知道为什么会出现这个这个问题 你在使用VScode编辑代码时 代码页面中文正常 而终端输出那里中文却为乱码 出现这个现象的原因是因为编码方式的不同 VScode的默认编码方式为UTF 8 中国地区下cmd的编码方
  • github下载的项目如何build--如何利用configure.ac和Makefile.am,生成Makefile。

    环境是Ubuntu18 04 1 aclocal命令根据configure ac文件的内容 自动生成aclocal m4文件 2 autoconf命令会根据configure ac和aclocal m4文件 生成configure文件 3
  • 基于 Flutter+Dart 聊天实例

    1 项目介绍 Flutter是目前比较流行的跨平台开发技术 凭借其出色的性能获得很多前端技术爱好者的关注 比如阿里闲鱼 美团 腾讯等大公司都有投入相关案例生产使用 flutter chatroom项目是基于Flutter Dart chew

随机推荐

  • TortoiseGit 入门指南11:还原与重置

    Git 就像个时光机器 能让我们还原到任何提交 还原未提交的更改 假如我们在查看一个干净的代码仓库 干净意味着工作区中的文件保持着最后一次提交的状态 没有修改 在查看的过程中 我们有意或无意的修改了工作区中的文件 之后我们想把这些文件恢复成
  • STLINK-V3 STDC14座转2.54mm排针转接板Kicad工程

    简介 这是一个 STLINK V3 STDC14座转2 54mm排针转接板Kicad工程 STDC14座实际工作中不太方便 所以搞了这个转接板 另外转接版上提供了可选的电源输出功能 An adapter board for STLINK V
  • EMC测试仪器_EMC测试整改流程及常见问题

    EMC主要是通过测试产品在电磁方面的干扰大小和抗干扰能力的综合评定 是产品在质量安全认证重要的指标之一 很多产品在做产品安全认证时都会遇到产品测试不合格的情况 尤其是在电磁兼容测试 即EMC测试 出错频率更是普遍 当产品一旦测试不合格 那么
  • J-002 Jetson电路设计之电源设计--NANO && XAVIER NX

    Jetson电源设计 1 电源说明 1 1 电源和系统引脚描述 1 2 电源控制框图详情 2 上电的时许 2 1 框图分析 2 2 上电时序 3 GND引脚 1 电源说明 Jetson NANO和XAVIER NX核心板的电源为DC 5V
  • 白盒测试之静态检查

    态检查一般是检查编码标准规范 错误列表 编码规范往往团队 会根据自己的经验和风格进行设置一些规范 现在很多IDE工具都会 在编辑代码的时候实时的提醒是否符合代码风格 错误列表 一般 是代码潜在的bug 由于某种代码写法虽然没有语法错误 但是
  • 现在有多个异步操作ajax请求,我们需要当所有异步请求都成功的时候,执行后续操作

    1 场景 现在有多个异步操作ajax请求 我们需要当所有异步请求都成功的时候 执行后续操作 2 方法 方法一 通常的讲 我们可以设置一个flag变量 然后在各自的ajax的成功回调内去维护这个变量数量 当满足条件时 我们来触发后续函数 方法
  • stat函数(stat、fstat、lstat)

    include
  • 基于STM32的录音与播音

    基于STM32的录音与播音 设计方案 本设计通过STM32的内置ADC加一个麦克风和放大电路 可以在网上买模块 实现音频的采集 然后存放在SD卡中 这里可以参考我之前的博客FATFS文件系统 然后再读取SD卡里存放的数据通过单片机的内置DA
  • [WPF]WPF Data Virtualization和UI Virtualization

    这篇博客将介绍WPF中的虚拟化技术 1 Data Virtualization 通常情况下我们说数据虚拟化是指数据源没有完全加载 仅加载当前需要显示的数据呈现给用户 这种场景会让我们想到数据分页显示 当需要特定页面的数据时 根据页数请求相应
  • noip2013提高组初赛(答案+选择题题目+个人分析)

    一 单项选择题 共 15 题 每题 1 5 分 共计 22 5 分 每题有且仅有一个正确 选项 1 一个 32 位整型变量占用 个字节 A 4 B 8 C 32 D 128 A 1字节 8位 1byte 8bit 2 二进制数 11 01
  • Linux 搜索文件和文件夹的 4 种简单方法

    英文 Prakash Subramanian 翻译 Linux中国 geekpi linux cn article 10362 1 html Linux 管理员一天都不能离开搜索文件 因为这是他们的日常活动 了解一些搜索的东西是不错的 因为
  • jquery的ajax数据显示不出来,jQuery的Ajax请求确实在HTML元素不显示数据

    当我运行在循环Ajax请求 成功AJAX不显示返回的数据 这里是代码 jQuery的Ajax请求确实在HTML元素不显示数据 url siteAdmin statistics queriesAjax php siteAdmin statis
  • 5.3中断系统中的设备树——中断号的演变与irq_domain

    通过上一节我们知道 在内核中有一个irq desc数组 数组里面的每一项对应一个中断 数组的下标就是对应中断的虚拟中断号 virq 假设只有一个中断控制器 有32个中断 那么中断和irq desc数组可以一一对应 每一个数组项对应一个中断
  • 通用LOG封装

    ifndef LOG H define LOG H if defined cplusplus extern C endif include stm32l0xx hal h include
  • 区块链的物演天论

    自本周一以来 黄金白银遭受了猛烈的下跌 就像我之前文章表述的 当投资者开始担心美股的涨幅的时候 市场就会出现动摇 进而影响了黄金与白银的下跌 其实 从9月初开始 欧美股市已经遭遇了猛烈抛售 美股已经距离9月初高点跌去10 以上 除了美股以外
  • [632]mysql安装(centos7

    文章目录 centos7 tar包安装 MySQL5 7 一 CentOS7 4系统自带mariadb 二 检查mysql是否存在 三 查看用户和组是否存在 四 下载mysql的tar包 五 上传第四步下载的mysql TAR包到 六 更改
  • pycharm连接mysql8.0报错

    为了pycharm方便远程连接 偷懒未创建用户 直接修改root进行远程连接 但是修改完成之后 在使用pycharm连接数据库出现报错 RuntimeError cryptography is required for sha256 pas
  • Xcode error: Cannot link directly with dylib/framework, your binary is not an allowed client of /

    文章目录 编译报错 Trust App 编译报错 Mac 机子 数据线连接 iPhone13 通过 Appium 里的 appium webdriveragent WebDriverAgent xcodeproj 工程 来编译可以在 iPh
  • python实验(3)

    按公式s 12 22 32 n2 求累计加和 s不超过1000的最大项数n 程序运行结果如下所示 x 1 count 0 print x gt sum for x in range 0 14 count x x print str x gt
  • golang笔记-区块链密码学01

    文章目录 pbkdf2 Key 生成秘钥函数 HMAC 生成摘要算法 PrivKeyFromBytes 创建私钥 公钥对 pbkdf2 Key 生成秘钥函数 PBKDF2 Password Based Key Derivation Func