安全编程
信息数据化和传输网络化对数据和数据传输的安全提出了要求,在数据的传输中需要对数据进行加密,并使用安全的数据传输体系。一般来说,安全编程不是语言层面需要讨论的问题,而是每种语言都需要考虑的问题,但是Go是为网络时代设计的语言,对网络的支持也已融入其设计中,因此网络数据安全及其相应的体系就成了必须探讨的话题。
数据加密
对称加密
用单密钥的加密算法,称为对称加密,由需要加密的明文、加密算法和密钥。在客户端加密和服务端解密中使用的密钥都是相同的一个。常见的单密钥加密算法有DES、AES、RC4等。
非对称加密
采用双密钥的加密算法,称为非对称加密,由需要加密的明文、加密算法、私钥和公钥。在该系统中,私钥和公钥都可以被用作加密或者解密,但是用私钥加密的明文,必须要用对应的公钥解密,用公钥加密的明文,必须用对应的私钥解密。常见的双密钥加密算法有RSA等。
在对称加密中,私钥不能暴露,否则在算法公开的情况下,数据等同于明文,而在非对称加密中,公钥是公开的,私钥是保密的。这样任何人都可以把自己的信息通过公钥和算法加密,然后发送给公钥的发布方,只有公钥发布方才能解开密文。在对称加密和非对称加密中,它们有一个共同的特点,即数据可以加密,也可以解密。实际上,我们还有一种加密需求,只需要加密,形成一个密文,而不需要解密,甚至极端地说,要求不可解密。这时候,可以使用哈希算法等。哈希算法是一种从任意数据中创建固定长度摘要信息的办法。一般我们要求,对于不同的数据,要求产生的摘要信息也是唯一的。常见的哈希算法包括MD5、SHA-1等。
数字签名
数字签名,是指用于标记数字文件拥有者、创造者、分发者身份的字符串。数字签名拥有标记文件身份、分发的不可抵赖性等作用。
数字证书
登录某银行的网站,这时候网站会提示我们下载数字证书,否则将无法正常使用网银等功能。在我们首次使用U盾的时候,初始化过程即是向U盾中下载数字证书。那么,数字证书中包含什么呢?数字证书中包含了银行的公钥,有了公钥之后,网银就可以用公钥加密我们提供给银行的信息,这样只有银行才能用对应的私钥得到我们的信息,确保安全。
PKI 体系
PKI,全称公钥基础设施,是使用非对称加密理论,提供数字签名、加密、数字证书等服务的体系,一般包括权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等。围绕PKI体系,建立了一些权威的、公益的机构。它们提供数字证书库、密钥备份及恢复系统、证书作废系统、应用接口等具体的服务。比如,企业的数字证书,需要向认证机构申请,以确保数字证书的安全。
Go 语言的哈希函数
Go提供了MD5、SHA-1等几种哈希函数。如下:
package main
import(
"fmt"
"crypto/sha1"
"crypto/md5"
)
func main(){
TestString:="Hi,pandaman!"
Md5Inst:=md5.New()
Md5Inst.Write([]byte(TestString))
Result:=Md5Inst.Sum([]byte(""))
fmt.Printf("%x\n\n",Result)
Sha1Inst:=sha1.New()
Sha1Inst.Write([]byte(TestString))
Result=Sha1Inst.Sum([]byte(""))
fmt.Printf("%x\n\n",Result)
}
支持HTTPS的Web服务器
Go语言目前实现了TLS协议的部分功能,已经可以提供最基础的安全层服务。使用http.ListenAndServerTLS实现一个支持HTTPS的Web服务器。如下:
package main
import (
"fmt"
"net/http"
)
const SERVER_PORT = 8080
const SERVER_DOMAIN = "localhost"
const RESPONSE_TEMPLATE = "hello"
func rootHandler(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/html")
w.Header().Set("Content-Length", fmt.Sprint(len(RESPONSE_TEMPLATE)))
w.Write([]byte(RESPONSE_TEMPLATE))
}
func main() {
http.HandleFunc(fmt.Sprintf("%s:%d/", SERVER_DOMAIN, SERVER_PORT), rootHandler)
http.ListenAndServeTLS(fmt.Sprintf(":%d", SERVER_PORT), "rui.crt", "rui.key", nil)
}
使用了http.ListenAndServerTLS()这个方法,这表明它是执行在TLS层上的HTTP协议。如果我们并不需要支持HTTPS,只需要把该方法替换为http.ListenAndServeTLS(fmt.Sprintf(":%d", SERVER_PORT), nil)即可。
支持HTTPS的文件服务器
同样可以实现支持https的文件服务器如下:
package main
import (
"net/http"
)
func main(){
h := http.FileServer(http.Dir("."))
http.ListenAndServeTLS(":8001", "rui.crt", "rui.key", h)
}
总结
点到为止的介绍了Go语言对安全编程的支持!
备注
本文正在参与「掘金Golang主题学习月」, 点击查看活动详情。