鑒權前置知識:加密解密
===
### Base64編碼實現:
```
input := []byte("hello")
string := base64.StdEncoding.EncodeToString(input) // 序列化
de := base64.StdEncoding.DecodeString(string) //反序列化 string(de)
string := base64.URLEncoding.EncodeToString(input) // URL序列化
de := base64.URLEncoding.DecodeString(string) //URL反序列化 string(de)
```
### RSA265 非對稱加密編碼實現
非對稱加密需要生成私鑰和公鑰
我們這里通過openssl來生成
我們現在的操作系統是ubuntu18.4
```
apt-get update // 更新系統軟化包緩存
apt-get install openssl -y // 安裝openssl
openssl genrsa -out app_private_key.pem 1024 // 生成ras256 私鑰 在當前目錄下
openssl rsa -in app_private_key.pem -pubout -out app_public_key.pem // 生成ras256公鑰 在當前目錄下
```
現在我們有了ras的私鑰和公鑰了
現在我們要實現加密解密模塊 這個地方只要看懂就行
```
/**
Rsa256加密
param: origData原始數據
param: publicKey 公鑰
*/
func Rsa256Encrypt(origData,publicKey[]byte) ([]byte,error) {
p, _ := pem.Decode(publicKey)
if p == nil {
return nil,errors.New("public key error")
}
pub, err := x509.ParsePKIXPublicKey(p.Bytes)
if err != nil{
return nil,err
}
key := pub.(*rsa.PublicKey)
return rsa.EncryptPKCS1v15(rand.Reader,key,origData)
}
/**
Rsa256解密
param: ciphertext 密文
param: privateKey 私鑰
*/
func Rsa256Decrypt(ciphertext,privateKey []byte) ([]byte,error) {
p, _ := pem.Decode(privateKey)
if p == nil {
return nil,errors.New("private key error")
}
key, e := x509.ParsePKCS1PrivateKey(p.Bytes)
if e != nil {
return nil,e
}
return rsa.DecryptPKCS1v15(rand.Reader,key,ciphertext)
}
```
現在我們新建一個測試文件來測試以下
```
func TestRSA(t *testing.T) {
bytes, e := ioutil.ReadFile("../app_public_key.pem")
if e != nil {
t.Fatal(e.Error())
}
ordata := []byte("123456")
encrypt, e := utils.Rsa256Encrypt(ordata, bytes)
if e != nil {
t.Fatal(e.Error())
}
s := base64.URLEncoding.EncodeToString(encrypt)
file, e := ioutil.ReadFile("../app_private_key.pem")
if e != nil {
t.Fatal(e.Error())
}
decodeString, _ := base64.URLEncoding.DecodeString(s)
decrypt, e := utils.Rsa256Decrypt([]byte(decodeString), file)
if e != nil {
t.Fatal(e.Error())
}
t.Log(s)
t.Log(encrypt)
t.Log(string(ordata))
t.Log(string(decrypt))
}
```
此處大家留意下我用base64把加密出來的密文再編碼了一遍,是因為加密出來有可能無法顯示
- 初認GOlang Web
- 關于環境配置
- 路由
- 路由進階與目錄架構
- 靜態文件服務器
- 自定義Middleware
- 與MySQL起舞
- 主從模式概念
- 部署主從集群
- 分庫分表
- 補充:事務
- 補充:常用SQL示例
- Template使用
- 一些小的,但是要知道的東西
- 調度任務
- 流控算法
- 鑒權
- JWT鑒權前置知識:加密解密
- session
- 文件上傳與下載
- 帶緩存讀寫拷貝io
- 參考
- 寫好的文件上傳
- 文件下載
- 拓展:秒傳功能實現
- 擴展:分塊上傳和斷點續傳
- 擴展:分塊上傳
- 擴展:斷點續傳
- 擴展:分布式存儲
- 部署ceph集群
- cephAuth
- go操作ceph集群
- 擴展:云存儲
- go操作oss
- 補充:xorm框架
- 命令小結
- 補充:xorm框架高級部分
- 補充
- MongoDB
- 基礎概念
- 簡簡單單NoSql
- 操作集合(Collection)
- 操作文檔(Document)
- 帶條件的文檔 db.find
- 復雜條件抽文檔 db.find
- redis
- redis操作
- go操作redis
- (新增)配置鑒權
- 密碼學
- 文件校驗算法
- 未來課程的安排
- RPC實踐
- 爬蟲
- 正則表達式
- 爬取手機號
- 爬取郵箱
- 爬取超鏈接
- 爬取身份證號
- 并發爬圖片
- 擴展:CICD
- GO實現自動化部署系統
- 國際化支持
- 并發帶來問題的解決
- GOWEB小知識
- Sync包講解
- sync.Pool
- 千萬級WebSocket消息推送
- 微服務入門:開篇
- 路由通訊
- RabbitMQ
- RabbitMQ工作原理和轉發模式
- Dcoker 下 RabbitMQ and Ui
- Go操作RabbitMQ
- 初步微服務
- go-micro
- 補充:consul
- 快速入門
- 補充:consul超時
- 微服務架構
- 微服務架構全景圖
- 服務注冊和發現
- raft協議基本概念
- raft協議leader選舉詳解
- raft協議日志復制詳解
- raft協議safefy詳解
- rpc調用個服務監控
- etcd
- 命令行使用
- Golang操作etcd
- GO操作etcd OP方式 (分布式鎖基礎)
- etcd 分布式集群樂觀鎖
- (新增)鑒權
- 服務注冊
- 服務發現原理
- 選項設計模式介紹
- 基于插件的注冊組建
- 課前知識
- etcd注冊開發1
- ffmpeg
- 2.0新的啟航
- 高可用Mysql
- mysql邏輯架構
- 常見的MySQL高可用方案
- 索引
- MYSQL調優
- 什么影響了MYSQL的性能
- Mysql 服務器參數配置
- Go深入并發
- 基本同步原語
- 擴展同步原語
- 原子操作
- M P G 模型
- 簡單的消息總線
- GoMicro入門
- GO任務池編寫
- GO依賴注入
- 一些補充
- golang defer在什么時候執行
- 分布式理論篇(面試吹牛必備)
- CAP理論
- Raft協議
- 保證注冊中心的可靠性
- 鏈路追蹤
- 怎么實現強一致性