从0开始go语言-17|Go主题月

236 阅读4分钟

安全编程

信息数据化和传输网络化对数据和数据传输的安全提出了要求,在数据的传输中需要对数据进行加密,并使用安全的数据传输体系。一般来说,安全编程不是语言层面需要讨论的问题,而是每种语言都需要考虑的问题,但是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主题学习月」, 点击查看活动详情