最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GoLang中的加密方法小結(jié)

 更新時(shí)間:2023年02月16日 14:18:07   作者:@航空母艦  
這篇文章主要介紹了GoLang中的加密方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

GoLang加密方法

以下Golang代碼的加密結(jié)果與Java語言結(jié)果一致,需要注意結(jié)果大小寫問題。

package tool
?
import (
? ? "appback/src/logger"
? ? "bytes"
? ? "crypto/aes"
? ? "crypto/cipher"
? ? "crypto/hmac"
? ? "crypto/md5"
? ? "crypto/rand"
? ? "crypto/rsa"
? ? "crypto/sha1"
? ? "crypto/sha256"
? ? "crypto/sha512"
? ? "crypto/x509"
? ? "encoding/base64"
? ? "encoding/hex"
? ? "encoding/pem"
? ? "fmt"
? ? "strings"
)
?
// md5驗(yàn)證
func MD5Str(src string) string {
? ? h := md5.New()
? ? h.Write([]byte(src)) // 需要加密的字符串為
? ? // fmt.Printf("%s\n", hex.EncodeToString(h.Sum(nil))) // 輸出加密結(jié)果
? ? return hex.EncodeToString(h.Sum(nil))
}
?
// hmacsha256驗(yàn)證
func HMAC_SHA256(src, key string) string {
? ? m := hmac.New(sha256.New, []byte(key))
? ? m.Write([]byte(src))
? ? return hex.EncodeToString(m.Sum(nil))
}
?
// hmacsha512驗(yàn)證
func HMAC_SHA512(src, key string) string {
? ? m := hmac.New(sha512.New, []byte(key))
? ? m.Write([]byte(src))
? ? return hex.EncodeToString(m.Sum(nil))
}
?
func HMAC_SHA1(src, key string) string {
? ? m := hmac.New(sha1.New, []byte(key))
? ? m.Write([]byte(src))
? ? return hex.EncodeToString(m.Sum(nil))
}
?
// sha256驗(yàn)證
func SHA256Str(src string) string {
? ? h := sha256.New()
? ? h.Write([]byte(src)) // 需要加密的字符串為
? ? // fmt.Printf("%s\n", hex.EncodeToString(h.Sum(nil))) // 輸出加密結(jié)果
? ? return hex.EncodeToString(h.Sum(nil))
}
?
// sha512驗(yàn)證
func SHA512Str(src string) string {
? ? h := sha512.New()
? ? h.Write([]byte(src)) // 需要加密的字符串為
? ? // fmt.Printf("%s\n", hex.EncodeToString(h.Sum(nil))) // 輸出加密結(jié)果
? ? return hex.EncodeToString(h.Sum(nil))
}
?
// base編碼
func BASE64EncodeStr(src string) string {
? ? return string(base64.StdEncoding.EncodeToString([]byte(src)))
}
?
// base解碼
func BASE64DecodeStr(src string) string {
? ? a, err := base64.StdEncoding.DecodeString(src)
? ? if err != nil {
? ? ? ? return ""
? ? }
? ? return string(a)
}
?
var ivspec = []byte("0000000000000000")
?
func AESEncodeStr(src, key string) string {
? ? block, err := aes.NewCipher([]byte(key))
? ? if err != nil {
? ? ? ? fmt.Println("key error1", err)
? ? }
? ? if src == "" {
? ? ? ? fmt.Println("plain content empty")
? ? }
? ? ecb := cipher.NewCBCEncrypter(block, ivspec)
? ? content := []byte(src)
? ? content = PKCS5Padding(content, block.BlockSize())
? ? crypted := make([]byte, len(content))
? ? ecb.CryptBlocks(crypted, content)
? ? return hex.EncodeToString(crypted)
}
?
func AESDecodeStr(crypt, key string) string {
? ? crypted, err := hex.DecodeString(strings.ToLower(crypt))
? ? if err != nil || len(crypted) == 0 {
? ? ? ? fmt.Println("plain content empty")
? ? }
? ? block, err := aes.NewCipher([]byte(key))
? ? if err != nil {
? ? ? ? fmt.Println("key error1", err)
? ? }
? ? ecb := cipher.NewCBCDecrypter(block, ivspec)
? ? decrypted := make([]byte, len(crypted))
? ? ecb.CryptBlocks(decrypted, crypted)
?
? ? return string(PKCS5Trimming(decrypted))
}
?
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
? ? padding := blockSize - len(ciphertext)%blockSize
? ? padtext := bytes.Repeat([]byte{byte(padding)}, padding)
? ? return append(ciphertext, padtext...)
}
?
func PKCS5Trimming(encrypt []byte) []byte {
? ? padding := encrypt[len(encrypt)-1]
? ? return encrypt[:len(encrypt)-int(padding)]
}
?
func RsaEncrypt(src, key string) string {
? ? block, _ := pem.Decode([]byte(key))
? ? if block == nil {
? ? ? ? return ""
? ? }
?
? ? pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
? ? if err != nil {
? ? ? ? logger.SysLogger.Err(err.Error())
? ? ? ? return ""
? ? }
?
? ? pub := pubInterface.(*rsa.PublicKey)
?
? ? crypted, err := rsa.EncryptPKCS1v15(rand.Reader, pub, []byte(src))
? ? if err != nil {
? ? ? ? logger.SysLogger.Err(err.Error())
? ? ? ? return ""
? ? }
?
? ? return hex.EncodeToString(crypted)
}

調(diào)用

package main
?
import (
?? ?"./tool"
?? ?"fmt"
)
?
func main() {
?? ?fmt.Printf(tool.MD5Str("111"))
}

GoLang三類加密算法

哈希算法

名稱速度/安全性
crc32速度快,安全性低 2^32
adler速度快,安全性低 2^32
crc64速度稍微快,安全性低 2^64
md5速度一般,安全性一般 2^128
sha1速度一般,安全性一般 2^128
sha256速度慢安全性高 2^256
sha512速度慢,安全性極高 2^512

hash函數(shù)應(yīng)用:

消息認(rèn)證是用來驗(yàn)證消息完整性的一種機(jī)制或服務(wù),消息認(rèn)證確認(rèn)收到的數(shù)據(jù)確實(shí)和發(fā)送時(shí)的一樣(即防篡改),并且還要確保發(fā)送方的身份是真實(shí)有效的的(即防冒充)。

也就是說哈希函數(shù)只是確定信息來自生產(chǎn)者,只有驗(yàn)證功能,不可用于信息傳輸,因?yàn)闆]有解密算法。

表格中算法的golang實(shí)現(xiàn)

import 包 :

import (
?? ?"hash/crc32"
?? ?"hash/crc64"
?? ?"hash/adler32"
?? ?"crypto/sha512"
?? ?"crypto/sha256"
?? ?"crypto/sha1"
?? ?"crypto/md5"
?? ?"encoding/hex"
)

老師說用于驗(yàn)證的哈希函數(shù),一般不單個(gè)用,定義加密接口的時(shí)候,定義一個(gè)[]string用于存放組合的哈希函數(shù)的名字,如:[]string{“md5",“crc64”,“sha256”.“sha256”······}

type AllHash struct {
?? ?Alog []string
}

綁定方法根據(jù)哈希名字將數(shù)據(jù)哈希化,這些函數(shù)被Go標(biāo)準(zhǔn)庫給敷衍了,解釋在十個(gè)字以內(nèi),要不就沒有,我giao

對(duì)于md5,sha1,sha256,sha512步驟一樣,

我猜:

(以md5為例)

1.New一個(gè)的對(duì)象,相當(dāng)于申請(qǐng)了一塊buf:myhash:=md5.New()

2.向這個(gè)buf中寫入字節(jié)類型的數(shù)據(jù):myhash.Write([]byte(laststr))

3.進(jìn)行相應(yīng)的哈希運(yùn)算:bs:=myhash.Sum(nil),我用反射查看bs的類型是[]uint8.

4.最終數(shù)據(jù)以16進(jìn)制輸出 :laststr=hex.EncodeToString(bs)或者fmt.Sprintf("%x", bs)

func (allhash *AllHash)GetBytesHash(data[]byte)string{
?? ?var laststr string
?? ?laststr=string(data)
?? ?for i:=0;i<len(allhash.Alog);i++{


?? ??? ?switch allhash.Alog[i] {
?? ??? ?case "md5":
?? ??? ??? ?myhash:=md5.New()
?? ??? ??? ?myhash.Write([]byte(laststr))
?? ??? ??? ?bs:=myhash.Sum(nil)
?? ??? ??? ?laststr=hex.EncodeToString(bs)
?? ??? ?case "sha1":
?? ??? ??? ?myhash:=sha1.New()
?? ??? ??? ?myhash.Write([]byte(laststr))
?? ??? ??? ?bs:=myhash.Sum(nil)
?? ??? ??? ?laststr=hex.EncodeToString(bs)
?? ??? ?case "sha256":
?? ??? ??? ?myhash:=sha256.New()
?? ??? ??? ?myhash.Write([]byte(laststr))
?? ??? ??? ?bs:=myhash.Sum(nil)
?? ??? ??? ?laststr=hex.EncodeToString(bs)
?? ??? ?case "sha512":
?? ??? ??? ?myhash:=sha512.New()
?? ??? ??? ?myhash.Write([]byte(laststr))
?? ??? ??? ?bs:=myhash.Sum(nil)
?? ??? ??? ?laststr=hex.EncodeToString(bs)
?? ??? ?case "crc32":
?? ??? ??? ?mycrc:=crc32.NewIEEE()
?? ??? ??? ?io.WriteString(mycrc,laststr)
?? ??? ??? ?laststr=fmt.Sprintf("%x",mycrc.Sum32())
?? ??? ?case "crc64":
?? ??? ??? ?const ISO = 0xD800000000000000
?? ??? ??? ?tabISO := MakeTable(ISO)
?? ??? ??? ?c := crc64.New(tabISO)
?? ??? ??? ?io.WriteString(c, laststr)
?? ??? ??? ?s := c.Sum64()
?? ??? ??? ?laststr=fmt.Sprintf("%x",s)
?? ??? ?case "adler32":
?? ??? ??? ?c := adler32.New()
?? ??? ??? ?io.WriteString(c, laststr)
?? ??? ??? ?state, err := c.(encoding.BinaryMarshaler).MarshalBinary()
?? ??? ??? ?if err!=nil{
?? ??? ??? ??? ?fmt.Println(err)
?? ??? ??? ?}
?? ??? ??? ?laststr=hex.EncodeToString(state)
?? ??? ??? ?}
}

對(duì)稱加密

對(duì)稱加密,消息發(fā)送端要先有一個(gè)密鑰,然后執(zhí)行加密算法,獲得加密數(shù)據(jù);接受端要事先獲得發(fā)送者的密鑰,用密鑰進(jìn)行解密。

對(duì)稱加密適合對(duì)大量數(shù)據(jù)進(jìn)行加密,由于傳輸密鑰并不安全,真正使用時(shí),對(duì)數(shù)據(jù)進(jìn)行對(duì)稱加密,對(duì)密鑰進(jìn)行非對(duì)稱加密。

DES加密步驟:

  • 1.確定密鑰位數(shù),不夠的補(bǔ)零,超了截。這里假設(shè)密鑰是24位
  • 2.調(diào)用第三方庫goEncrypt的TripleDesEncrypt,利用密鑰進(jìn)行加密
  • 3.返回加密數(shù)據(jù)。
func Encrypt(datastr []byte,password []byte)[]byte {

?? ?length:=len(password)
?? ?if length<24{
?? ??? ?for i:=0;i<=24-1-length;i++{
?? ??? ??? ?password=append(password,0)
?? ??? ?}
?? ?}else if length>24 {
?? ??? ?password=password[:24]
?? ?}

?? ?cryptText, err := goEncrypt.TripleDesEncrypt(datastr, password)
?? ?if err != nil {
?? ??? ?fmt.Println(err)
?? ??? ?return []byte{}
?? ?}
?? ?return cryptText
}

DES解密步驟:

  • 1.確定密鑰位數(shù),不夠的補(bǔ)零,超了截。這里假設(shè)密鑰是24位
  • 2.調(diào)用第三方庫goEncrypt的TripleDesDecrypt,利用密鑰進(jìn)行解密
  • 3.返回解密數(shù)據(jù)
func Decrypt(datastr []byte,password []byte)[]byte ?{
?? ?length:=len(password)
?? ?if length<24{
?? ??? ?for i:=0;i<=24-1-length;i++{
?? ??? ??? ?password=append(password,0)
?? ??? ?}
?? ?}else if length>24 {
?? ??? ?password=password[:24]
?? ?}
?? ?//fmt.Println(len(password))
?? ?newplaintext, err:= goEncrypt.TripleDesDecrypt(datastr, password)
?? ?if err != nil {
?? ??? ?fmt.Println(err)
?? ??? ?return []byte{}
?? ?}
?? ?return newplaintext
}

非對(duì)稱加密

私鑰加密,公鑰解密;公鑰加密,私鑰解密,稱之為非對(duì)稱加密。

雙方進(jìn)行信息傳遞,雙方都需要?jiǎng)?chuàng)建公鑰和私鑰,如果己方用私鑰加密,就要把公鑰傳給對(duì)方,對(duì)方用公鑰解密。

下面是ECCgolang實(shí)現(xiàn):

func (e *ECC )Encrypt(datastr []byte)[]byte {

?? ?cryptText, err:= goEncrypt.EccEncrypt(datastr , []byte(e.publickey))
?? ?if err!=nil{
?? ??? ?return []byte{}
?? ?}
?? ?return cryptText
}
func (e *ECC )Decrypt(datastr []byte)[]byte ?{
?? ?msg, err := goEncrypt.EccDecrypt(datastr , []byte(e.privatekey))
?? ?if err != nil {
?? ??? ?return []byte{}
?? ?}
?? ?return msg
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解析Golang中引用類型是否進(jìn)行引用傳遞

    解析Golang中引用類型是否進(jìn)行引用傳遞

    這篇文章主要為大家介紹了Golang中引用類型是否進(jìn)行引用傳遞剖析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 如何在Go中使用Casbin進(jìn)行訪問控制

    如何在Go中使用Casbin進(jìn)行訪問控制

    這篇文章主要介紹了如何在Go中使用Casbin進(jìn)行訪問控制,Casbin是一個(gè)強(qiáng)大的、高效的開源訪問控制框架,其權(quán)限管理機(jī)制支持多種訪問控制模型,Casbin只負(fù)責(zé)訪問控制
    2022-08-08
  • Golang 獲取系統(tǒng)信息的實(shí)現(xiàn)

    Golang 獲取系統(tǒng)信息的實(shí)現(xiàn)

    本文主要介紹了Golang 獲取系統(tǒng)信息的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Golang對(duì)sqlite3數(shù)據(jù)庫進(jìn)行操作實(shí)踐記錄

    Golang對(duì)sqlite3數(shù)據(jù)庫進(jìn)行操作實(shí)踐記錄

    sqlite是嵌入式關(guān)系型數(shù)據(jù)庫引擎,官方描述為自包含的、無服務(wù)的、零配置并支持事務(wù)的關(guān)系型數(shù)據(jù)庫引擎,下面這篇文章主要給大家介紹了關(guān)于Golang對(duì)sqlite3數(shù)據(jù)庫進(jìn)行操作的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • 詳解Go語言中的逃逸分析

    詳解Go語言中的逃逸分析

    逃逸分析是編譯器用于決定將變量分配到棧上還是堆上的一種行為,下面小編就來為大家詳細(xì)講講go語言中是如何進(jìn)行逃逸分析的,需要的小伙伴可以參考下
    2023-09-09
  • 一文詳解golang中的gmp模型

    一文詳解golang中的gmp模型

    這篇文章主要介紹了golang中的gmp模型的誕生、概念及調(diào)度講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • GoLang并發(fā)編程中條件變量sync.Cond的使用

    GoLang并發(fā)編程中條件變量sync.Cond的使用

    Go標(biāo)準(zhǔn)庫提供Cond原語的目的是,為等待/通知場(chǎng)景下的并發(fā)問題提供支持,本文主要介紹了Go并發(fā)編程sync.Cond的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-01-01
  • Golang拾遺之自定義類型和方法集詳解

    Golang拾遺之自定義類型和方法集詳解

    golang拾遺主要是用來記錄一些遺忘了的、平時(shí)從沒注意過的golang相關(guān)知識(shí)。這篇文章主要整理了一下Golang如何自定義類型和方法集,需要的可以參考一下
    2023-02-02
  • 關(guān)于golang利用channel和goroutine完成統(tǒng)計(jì)素?cái)?shù)的思路

    關(guān)于golang利用channel和goroutine完成統(tǒng)計(jì)素?cái)?shù)的思路

    這篇文章主要介紹了golang利用channel和goroutine完成統(tǒng)計(jì)素?cái)?shù)的思路詳解,通過思路圖分析及實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • golang方法中receiver為指針與不為指針的區(qū)別詳析

    golang方法中receiver為指針與不為指針的區(qū)別詳析

    這篇文章主要給大家介紹了關(guān)于golang方法中receiver為指針與不為指針區(qū)別的相關(guān)資料,其實(shí)最大的區(qū)別應(yīng)該是指針傳遞的是對(duì)像的引用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10

最新評(píng)論

巴林左旗| 峨边| 师宗县| 洛南县| 永新县| 赣州市| 庆云县| 伊春市| 峨眉山市| 富阳市| 西城区| 绍兴市| 麻阳| 康乐县| 渑池县| 丽水市| 贡觉县| 长兴县| 遂川县| 广丰县| 泰来县| 彭泽县| 兴化市| 潞西市| 盐津县| 萨嘎县| 衡南县| 文昌市| 栖霞市| 怀柔区| 贵南县| 武山县| 保康县| 兰考县| 成武县| 衢州市| 泸定县| 珲春市| 井研县| 射阳县| 澄城县|