Files
build-web-application-with-…/9.6.md
2012-10-20 19:21:37 +08:00

119 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
##9.6 加密和解密数据
前面小节介绍了如何存储密码,但是有的时候,我们想把一些敏感数据加密后存储起来,在将来的某个时候,随需将它们解密出来,此时我们应该在选用对称加密算法来满足我们的需求。
##base64加解密
如果Web应用足够简单数据的安全性没有那么严格的要求那么可以采用一种比较简单的加解密方法是`base64`这种方式实现起来比较简单Go语言的`base64`包已经很好的支持了这个,请看下面的例子:
package main
import (
"encoding/base64"
"fmt"
)
const (
base64Table = "123QRSTUabcdVWXYZHijKLAWDCABDstEFGuvwxyzGHIJklmnopqr234560178912"
)
var coder = base64.NewEncoding(base64Table)
func base64Encode(src []byte) []byte {
return []byte(coder.EncodeToString(src))
}
func base64Decode(src []byte) ([]byte, error) {
return coder.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))
}
##高级加解密
Go语言的`crypto`里面支持对称加密的高级加解密包有:
- `crypto/aes`包:AES(Advanced Encryption Standard)又称Rijndael加密法是美国联邦政府采用的一种区块加密标准。
- `crypto/des`DEA(Data Encryption Algorithm),是一种对称加密算法,是目前使用最广泛的密钥系统,特别是在保护金融数据的安全中。
因为这两种算法使用方法类似所以在此我们仅用aes包为例来讲解它们的使用请看下面的例子
package main
import (
"crypto/aes"
. "fmt"
"os"
)
func main() {
msg := "My name is Astaxie"
// some key, 16 Byte long
key := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}
Println("len of message: ", len(msg))
Println("len of key: ", len(key))
// create the new cipher
c, err := aes.NewCipher(key)
if err != nil {
Println("Error: NewCipher(%d bytes) = %s", len(key), err)
os.Exit(-1)
}
out := make([]byte, len(msg))
c.Encrypt(out, []byte(msg)) // encrypt the first half
//c.Encrypt(msgbuf[16:32], out[16:32]) // encrypt the second half
Println("len of encrypted: ", len(out))
Println(">> ", out)
// // now we decrypt our encrypted text
plain := make([]byte, len(out))
c.Decrypt(plain, out)
Println("msg: ", string(plain))
}
上面通过调用函数`aes.NewCipher`(参数key必须是16、24或者32位的[]byte分别对应AES-128, AES-192或AES-256算法),返回了一个`cipher.Block`接口,这个接口实现了三个功能:
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算法。
## links
* [目录](<preface.md>)
* 上一节: [存储密码](<9.5.md>)
* 下一节: [小结](<9.7.md>)
## LastModified
* $Id$