加密演算法的使用

huxiaobai_001發表於2020-07-08

場景:大流量高併發下如果使用session做使用者登入驗證或者讀取session裡面的東東去做一些業務邏輯處理勢必會對伺服器造成較大的資源浪費,另外就是分散式部署的時候如果採用session那麼你還得有一套session共享的機制,你說蛋疼不蛋疼,豈不是又多了一個服務需要維護,咋辦呢?不用session用cookie啊!但是cookie是儲存到客戶端的,容易被使用者篡改啊!咋辦?加密唄!咋加密?base64()? md5()?都是扯淡!都容易被破解的,就算你雙重加密也沒用,也一樣會被高手破解,當然我不是高手我破解不了!什麼才是絕對的安全的加密呢?主角出場啦!那 就 是 aes加密!(微信小程式也是使用的aes加密)什麼是aes加密?詳情請戳:
golang當中實現aes加密演算法
aes.go檔案:

package encrypt

import (
   "bytes"
 "crypto/aes" "crypto/cipher" "encoding/base64" "errors")

//高階加密標準(Adevanced Encryption Standard,AES)
//雙向加密  在目前認知範圍內是不可能被破解的

//16或者24或者32字串的話 分表對應不同的加密標準 AES-128  AES-192 AES-256加密方法
var PwdKey = []byte("KDJDKJJFJ*LKJSD)")  //這個Pwdkey是一定不能洩露的哈!很重要!

//PKCS7 填充模式
func PKCS7Padding(ciphertext []byte,blockSize int) []byte {
   padding := blockSize-len(ciphertext)%blockSize
  //Repeat()函式的功能是把切片[]byte{byte(padding)}複製padding個,然後合併成新的位元組切片返回
  padtext := bytes.Repeat([]byte{byte(padding)},padding)
   return append(ciphertext,padtext...)
}

//PKCS7填充的反向操作,刪除填充的字串
func PKCS7UnPadding(origData []byte)([]byte,error){
   //獲取資料長度
  length := len(origData)
   if length == 0 {
      return nil,errors.New("加密字串錯誤!")
   }else{
      //獲取填充字串長度
  unpadding := int(origData[length-1])
      //擷取切片,刪除填充位元組,並且返回明文 [:8]擷取切片 這個在之前是學過的哈
  return origData[:(length-unpadding)],nil
  }
}

//aes加密操作
func AesEcrypt(origData []byte,key []byte) ([]byte,error) {
   //建立加密演算法例項
  block, err := aes.NewCipher(key)
   if err != nil {
      return nil,err
  }
   //獲取塊大小
  blockSize := block.BlockSize()
   //對資料進行填充,讓資料長度滿足需求
  origData = PKCS7Padding(origData, blockSize)
   //採用AES加密方法中的CBC加密模式
  blocMode := cipher.NewCBCDecrypter(block,key[:blockSize])
   crypted := make([]byte,len(origData))
   //執行加密
  blocMode.CryptBlocks(crypted,origData)
   return crypted,nil
}

//aes解密操作
func AesDeCrypt(cypted []byte,key []byte)([]byte,error){
   //建立加密演算法例項
  block, err := aes.NewCipher(key)
   if err != nil {
      return nil,err
  }
   //獲取塊大小
  blockSize := block.BlockSize()
   //採用AES加密方法中的CBC加密模式 建立加密客戶端例項
  blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
   origData := make([]byte,len(cypted))
   //這個函式還可以用來解密
  blockMode.CryptBlocks(origData,cypted)
   //去除填充字串
  origData,err = PKCS7UnPadding(origData)
   if err != nil {
      return nil,err
  }
   return origData,err
}

//加密base64
func EnPwdCode(pwd []byte)(string,error){
   result, err := AesEcrypt(pwd, PwdKey)
   if err != nil {
      return "",err
  }
   return base64.StdEncoding.EncodeToString(result),err
}

//解密base64
func DePwdCode(pwd string)([]byte,error){
   //解密base64字串
  pwdByte, err := base64.StdEncoding.DecodeString(pwd)
   if err != nil {
      return nil,err
  }
   //執行aes解密
  return AesDeCrypt(pwdByte,PwdKey)
}

如何使用呢?
在你需要對資料進行加密的地方執行:

//呼叫ase加密函式
uidString, err := encrypt.EnPwdCode(uidByte)

就這麼簡單!
裡面顯示aes加密然後再來了一層base64()加密!目前aes加密演算法世界上沒一個人可以破解!就這麼牛逼!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

胡軍

相關文章