3.3. aes算法加密cookie
平日里我们在做开发的时候比如登录基本都是搞的session机制,但是这在中小型系统当中是比较常用的,如果是超大型系统比如我们这里要实现的高并发大流量的秒杀系统就不大好使了,因为流量大了你还在不断的去服务器请求session,这就是一种浪费,流量小提现不出来,一旦流量上来就完犊子啦!
什么是session?什么是cookie?
cookie 采用的是在客户端保存状态和数据的方案
session:采用的是在服务器端保存状态和数据的方案
session也是基于cookie实现的哈!因为会有一个sessionID保存到cookie里面然后拿着sessionid去服务器找对应的session值
这些要是不知道 下边的文章就不要再看了吧!
正是因为session保存在服务器上,当访问量增多的时候会占用比较大的服务器资源
因为cookie存在浏览器上 在一定情况下会被串改 比较不安全 那就得要对cookie进行加密然后再到服务器去解密来使用!
所以撒!用加密的cookie代替session在秒杀系统当中去应用不是很香吗?
golang当中实现aes加密解密算法工具类:
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)
}
aes介绍请戳博客:加密算法的使用
博客:AES 加密算法的详细介绍