文章目錄
- pbkdf2.Key() 生成秘鑰函式
- HMAC 生成摘要演算法
- PrivKeyFromBytes 創建私鑰、公鑰對
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開發者、技術大佬學習交流,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/389239.html
標籤:區塊鏈
