加密算法的使用

场景:大流量高并发下如果使用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.NewCBCEncrypter(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 协议》,转载必须注明作者和本文链接
胡军
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!