Go语言中的安全

前面我们一直在讲关于Go语言的一些基础的包中的函数,那么我们写好程序的同时,也需要考虑到程序的一个安全问题才是最重要的,安全编程和测试一直是开发过程中不可或缺的一部分。
现如今的信息数据化和传输网络化对数据和数据传输的安全提出了很大的要求,在这两个环节上,需要对数据进行加密,并使用安全的数据传输体系。

安全相关的基础概念

数据加密

单秘钥的加密方法被称为对称加密,在加密和解密的过程中,使用的秘钥只有一个,常见的对称加密算法有DES,AES,RC4
而双秘钥的加密方法则被称为非对称加密。在加密和解密的过程中,使用的秘钥有两个,私钥和公钥都可以被用作加密或者解密,但是用私钥加密的明文,必须要用对应的公钥解密。常见的非对称加密算法有RSA等。
前面所说的这两大类内容,有一个共同的特点,那就是数据可以加密,同时也可以解密,但事实上,还有一种加密需求是只需要加密,这个时候,可以考虑使用哈希算法。
哈希算法是一种从任意数据中创建固定长度摘要信息的办法。常见的哈希算法包括MD5SHA-256等。

数字签名

数字签名,是指用于标记数字文件拥有者,创造者,分发者身份的字符串,数字签名拥有标记文件身份,分发的不可抵赖性等作用。目前,常用的数字签名采用了非对称加密的方式。

PKI体系

PKI,全称公钥基础设施,是使用非对称加密理论,提供数字签名,加密,数字证书等服务的体系,一般包括权威认证机构(CA),数字证书库,秘钥备份及恢复系统,证书作废系统和应用编程借口(API)等

通信安全

哈希函数
package main

import (
    "crypto/md5"
    "crypto/sha256"
    "fmt"
)

func main() {
    TestString := "Hello, golang!"
    Md5Inst := md5.New()
    Md5Inst.Write([]byte(TestString))
    Result := Md5Inst.Sum([]byte(""))
    fmt.Printf("%x", Result)
    fmt.Println()

    Sha256 := sha256.New()
    Sha256.Write([]byte(TestString))
    Result = Sha256.Sum([]byte(""))
    fmt.Printf("%x", Result)
}
/** The result is:
4b03b629e0efd2f8a84a74571b115015
a987c91c6c223b11b91c71d114fc1402603dfee532a34954cf0cd178a0683781
 */

同样,我们还可以对文件内容进行加密计算:

package main

import (
    "crypto/md5"
    "crypto/sha256"
    "fmt"
    "io"
    "log"
    "os"
)

func main() {
    fileName := "goProgramming/security/14-1.go"
    infile, err :=os.Open(fileName)
    if err == nil {
        md5h := md5.New()
        io.Copy(md5h, infile)
        fmt.Printf("The md5 of file is: %x", md5h.Sum([]byte("")))
        fmt.Println()
        
        sha256h := sha256.New()
        io.Copy(sha256h, infile)
        fmt.Printf("The sha256 of file is: %x", sha256h.Sum([]byte("")))
    } else {
        log.Fatal(err)
        os.Exit(1)
    }
}
加密通信流程

一般的HTTPS基于SSL协议。通过SSL可以把HTTP包数据以非对称加密的形式往返于浏览器和站点之间,从而避免被第三方非法获取。而TSL是建立于SSL V2.0之上的兼容协议,他们主要的区别在于所支持的加密算法
我们来看一下大致的SSL/TLS工作方式:

在浏览器中输入HTTPS协议的网址;
服务器向浏览器返回证书;
浏览器检查该证书的合法性;
浏览器使用证书中的公钥加密一个随机对称密钥,并将加密后的密钥和使用密钥加密后的请求URL一起发送到服务器;
服务器用私钥解密随机对称密钥,并用获取的密钥解密加密的请求URL
服务器把用户请求的网页用密钥加密,并返回给用户;
用户浏览器用密钥解密服务器发来的网页数据,并将其显示出来;

支持HTTPS的Web服务器

Go语言目前实现了TLS协议的部分功能,已经可以提供最基础的安全层服务。我们一起来看一下如何实现支持TSLWeb服务器:

const SERVER_PORT = 8000
const SERVER_DOMAIN = "localhost"
const RESPONSE_TEMPLATE = "Hello World."

func rootHandler(w http.ResponseWriter, r *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), "some.crt", "some.key", nil)
}

我们在这里使用的是http.ListenAndServerTLS()这个方法,如果我们使用非TLS方法,只需要替换成http.ListenAndServer(fmt.Sprintf(":%d", SERVER_PORT), nil)即可。

支持HTTPS的文件服务器

利用Go语言标准库中提供的完备封装,也可以很容易地实现一个支持HTTPS的文件服务器。

h := http.FileServer(http.Dir("."))
http.ListenAndServerTLS(":8001", "rui.crt", "rui.key", h)

这是一个极其简单的例子,只是单纯的介绍了FileServer函数的存在,这个函数的参数只有一个那么久是根目录路径,其他任务全部由ListenAndServer*等函数完成。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 前言 文中首先解释加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的...
    sunny冲哥阅读 2,983评论 0 2
  • 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现...
    sunny冲哥阅读 1,372评论 0 3
  • 数字证书原理 - 无恙 - 博客园 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明...
    拉肚阅读 1,659评论 0 3
  • 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现...
    已认证用户阅读 3,832评论 1 4
  • 原文地址:数字证书原理,公钥私钥加密原理 文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例...
    淇滨杜隆坦阅读 4,155评论 4 46