前面小節介紹了如何儲存密碼,但是有的時候,我們想把一些敏感資料加密後儲存起來,在將來的某個時候,隨需將它們解密出來,此時我們應該在選用對稱加密演算法來滿足我們的需求。
Copy package main
import (
"encoding/base64"
"fmt"
)
func base64Encode (src [] byte ) [] byte {
return [] byte (base64.StdEncoding. EncodeToString (src))
}
func base64Decode (src [] byte ) ([] byte , error ) {
return base64.StdEncoding. DecodeString ( string (src))
}
func main () {
// encode
hello := "你好,世界! hello world"
debyte := base64Encode ([] byte (hello))
fmt. Println (debyte)
// decode
enbyte, err := base64Decode (debyte)
if err != nil {
fmt. Println (err. Error ())
}
if hello != string (enbyte) {
fmt. Println ( "hello is not equal to enbyte" )
}
fmt. Println ( string (enbyte))
}
Copy package main
import (
"crypto/aes"
"crypto/cipher"
"fmt"
"os"
)
var commonIV = [] byte { 0x 00 , 0x 01 , 0x 02 , 0x 03 , 0x 04 , 0x 05 , 0x 06 , 0x 07 , 0x 08 , 0x 09 , 0x 0a , 0x 0b , 0x 0c , 0x 0d , 0x 0e , 0x 0f }
func main () {
//需要去加密的字串
plaintext := [] byte ( "My name is Astaxie" )
//如果傳入加密串的話,plaint 就是傳入的字串
if len (os.Args) > 1 {
plaintext = [] byte (os.Args[ 1 ])
}
//aes 的加密字串
key_text := "astaxie12798akljzmknm.ahkjkljl;k"
if len (os.Args) > 2 {
key_text = os.Args[ 2 ]
}
fmt. Println ( len (key_text))
// 建立加密演算法 aes
c, err := aes. NewCipher ([] byte (key_text))
if err != nil {
fmt. Printf ( "Error: NewCipher( %d bytes) = %s " , len (key_text), err)
os. Exit ( - 1 )
}
//加密字串
cfb := cipher. NewCFBEncrypter (c, commonIV)
ciphertext := make ([] byte , len (plaintext))
cfb. XORKeyStream (ciphertext, plaintext)
fmt. Printf ( " %s => %x \n" , plaintext, ciphertext)
// 解密字串
cfbdec := cipher. NewCFBDecrypter (c, commonIV)
plaintextCopy := make ([] byte , len (plaintext))
cfbdec. XORKeyStream (plaintextCopy, ciphertext)
fmt. Printf ( " %x => %s \n" , ciphertext, plaintextCopy)
}
Copy type Block interface {
// BlockSize returns the cipher's block size.
BlockSize () int
// Encrypt encrypts the first block in src into dst.
// Dst and src may point at the same memory.
Encrypt (dst, src [] byte )
// Decrypt decrypts the first block in src into dst.
// Dst and src may point at the same memory.
Decrypt (dst, src [] byte )
}
這小節介紹了幾種加解密的演算法,在開發 Web 應用的時候可以根據需求採用不同的方式進行加解密,一般的應用可以採用 base64 演算法,更加進階的話可以採用 aes 或者 des 演算法。