数据加密

对称加密

采用单密钥的加密算法,称为对称加密。

常见的单密钥加密算法有DESAESRC4等。

在对称加密中,私钥不能暴露,否则在算法公开的情况下,数据等同于明文。

非对称加密

采用双密钥的加密算法,称为非对称加密。

在该系统中,私钥和公钥都可以被用作加密或者解密,但是用私钥加密的明文,必须要用对应的公钥解密;用公钥加密的明文,必须用对应的私钥解密。

常见的双密钥加密算法有RSA等。

在非对称加密中,公钥是公开的,私钥是保密的。这样任何人都可以把自己的信息通过公钥和算法加密,然后发送给公钥的发布方,只有公钥发布方(公钥发布方拥有私钥)才能解开密文。

哈希加密

使用哈希算法可以实现加密后不可解密的需求。

哈希算法是一种从任意数据中创建固定长度摘要信息的办法,对于不同的数据,要求产生的摘要信息也是唯一的。

常见的哈希算法包括MD5SHA-1等。

数字签名

数字签名,是指用于标记数字文件拥有者、创造者、分发者身份的字符串。

常用的数字签名采用了非对称加密。

例如,A公司发布了一个可执行文件,称为AProduct.exe,A在AProduct.exe中加入了A公司的数字签名。A公司的数字签名是用A公司的私钥加密了AProduct.exe文件的哈希值,我们得到打过数字签名的AProduct.exe后,可以查看数字签名。这个过程实际上是用A公司的公钥解密了文件哈希值,从而可以验证两个问题:AProduct.exe是否由A公司发布,AProduct.exe是否被篡改。

数字证书

通过数字证书可以实现非对称加密。

首次使用U盾的时候,初始化过程即是向U盾中下载数字证书。数字证书中包含了银行的公钥,有了公钥之后,网银就可以用公钥加密我们提供给银行的信息,这样只有银行才能用对应的私钥得到我们的信息,确保安全。

PKI体系

PKI,全称:公钥基础设施。

是使用非对称加密理论,提供数字签名、加密、数字证书等服务的体系,一般包括权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等。

Golang的哈希函数

Go提供了MD5SHA-1等几种哈希函数,如下示例。

// 对字符串计算哈希值
TestString := "Hello, World!" // 使用MD5哈希
md5Hash := md5.New()
md5Hash.Write([]byte(TestString))
result := md5Hash.Sum([]byte(""))
fmt.Printf("%x\n", result) // 输出:65a8e27d8879283831b664bd8b7f0ad4 // 使用SHA-1哈希
sha1Hash := sha1.New()
sha1Hash.Write([]byte(TestString))
result = sha1Hash.Sum([]byte(""))
fmt.Printf("%x\n", result) // 输出:0a0a9f2a6772942557ab5355d76af442f8f65e01
// 对文件内容计算哈希值
TestFile := "123.txt" // 文件内容:Hello, World!
f, err := os.Open(TestFile)
if err != nil {
fmt.Println("Open file failed: ", err)
return
} // 计算MD5哈希
md5Hash := md5.New()
io.Copy(md5Hash, f)
result := md5Hash.Sum([]byte(""))
fmt.Printf("%x\n", result) // 输出:65a8e27d8879283831b664bd8b7f0ad4 // 计算SHA-1哈希
sha1Hash := sha1.New()
io.Copy(sha1Hash, f)
result = sha1Hash.Sum([]byte(""))
fmt.Printf("%x\n", result) // 输出:da39a3ee5e6b4b0d3255bfef95601890afd80709

加密通信

一般的HTTPS是基于SSL(Secure Sockets Layer)协议实现加密通信。

加密通信流程

如下流程是SSL/TLS的工作方式:

(1) 在浏览器中输入HTTPS协议的网址

(2) 服务器向浏览器返回证书

(3) 浏览器验证证书合法性

(4) 浏览器使用证书中的公钥加密一个随机对称密钥,并将加密后的密钥和使用密钥加密后的请求URL一起发送到服务器

(5) 服务器用私钥解密随机对称密钥,并用获取的密钥解密加密的请求URL

(6) 服务器把用户请求的网页用密钥加密,并返回给用户

(7) 用户浏览器用密钥解密服务器发来的网页数据,并将其显示出来

总结起来就是:浏览器与服务器之间通过非对称加密的方式交换对称加密密钥,数据内容使用对称加密算法加密后传输。

支持HTTPS的Web服务器

const content = "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(content)))
w.Write([]byte(content))
} func main() {
fmt.Println("支持https的Web服务器")
http.HandleFunc("/", rootHandler)
http.ListenAndServeTLS(":8080", "chench.crt", "chench.key", nil) // chench.crt和chench.key分别是自签名的证书和KEY文件
}

启动之后在浏览器中需要以HTTPS协议来访问:https://localhost:8080/

支持HTTPS的文件服务器

func main() {
fmt.Println("支持HTTPS的文件服务器")
h := http.FileServer(http.Dir("."))
http.ListenAndServeTLS(":8001", "chench.crt", "chench.key", h) // chench.crt和chench.key分别是自签名的证书和KEY文件
}

启动之后以HTTPS协议访问:https://localhost:8001/

需要注意的是,SSL/TLS协议只能运行于TCP之上,不能在UDP上工作,且SSL/TLS位于TCP与应用层协议之间,因此所有基于TCP的应用层协议都可以透明地使用SSL/TLS为自己提供安全保障。

所谓透明地使用是指既不需要了解细节,也不需要专门处理该层的包,比如封装、解封等。

学习go语言编程之安全编程的更多相关文章

  1. 如何轻松学习C语言编程!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  2. C、C++、Java到Python,编程入门学习什么语言好?

    摘要:回顾编程语言几十年来的兴衰起伏,似乎也折射了整个信息产业的变迁消亡,想要在技术的洪流里激流勇进,找准并学精一两门编程语言更加显得至关重要. 最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C ...

  3. C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  4. 新手学习C语言/C++编程你所必须要了解的知识!从计算机原理开始!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  5. GO学习-(19) Go语言基础之网络编程

    Go语言基础之网络编程 现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其 ...

  6. 学习go语言编程系列之定义变量

    package main import ( "fmt" "math") func main() { // 1. 定义变量名age,不初始化,使用对应类型的默认值 ...

  7. C语言与MATLAB接口 编程与实例 李传军编着

    罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ************ ...

  8. C++程序设计教程学习(1)-第一部分 编程基础

    第一章 概述 C++到底难不难学?没有学不会的事情 1.1 程序设计语言 语言 编程语言 人和计算机交流的工具,群体扩大,人人间交流过程描述与信息表达的工具 机器语言,汇编语言,高级语言 1.2 C+ ...

  9. go语言之行--网络编程、http处理流程详情

    一.简介 go语言中的网络编程主要通过net包实现,net包提供了网络I/O接口,包括HTTP.TCP/IP.UDP.域名解析和Unix域socket等.和大多数语言一样go可以使用几行代码便可以启动 ...

  10. 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础

    第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...

随机推荐

  1. [转帖]可直接拿来用的kafka+prometheus+grafana监控告警配置

    kafka配置jmx_exporter 点击:https://github.com/prometheus/jmx_exporter,选择下面的jar包下载: 将下载好的这个agent jar包上传到k ...

  2. [转帖]Redhat 8 磁盘调度策略变化:NOOP改为NONE

    说明 在 redhat 4/5/6/7版本中的NOOP调度策略,从8开始修改为NONE,官方解释: none Implements a first-in first-out (FIFO) schedu ...

  3. [转帖]Megacli 错误码

    MegaCLI Error Messages 0x00 Command completed successfully 0x01 Invalid command 0x02 DCMD opcode is ...

  4. [转帖]一个小技巧解决笔记本HDMI接口失灵

      https://baijiahao.baidu.com/s?id=1738289993804283647&wfr=spider&for=pc 现如今笔记本的接口是越来越多,哪怕是标 ...

  5. HTTPS下tomcat与nginx的前端性能比较

    HTTPS下tomcat与nginx的前端性能比较 摘要 之前比较http的web服务器的性能. 发现nginx 比 tomcat 要好 50% 然后想到, https的情况下不知道两者有什么区别 所 ...

  6. PostgreSQL简单添加只读用户的方法

    1. 添加了白名单只读来避免开发同事错误的修改数据库内的数据, 但是他们总想去查询数据库的内容. 最简单的办法是修改pg_hba.conf添加只读用户. 2. 添加只读用户. 使用psql登录pg数据 ...

  7. 使用Java读取Excel文件数据

    通过编程方式读取Excel数据能实现数据导入.批量处理.数据比对和更新等任务的自动化.这不仅可以提高工作效率还能减少手动处理的错误风险.此外读取的Excel数据可以与其他系统进行交互或集成,实现数据的 ...

  8. Unity Editor开发中查找属性的两种写法对比

    从2017开始,在editor脚本中查找属性是这样写的 var m_Script = serializedObject.FindProperty("m_Script"); Seri ...

  9. 基于 hugging face 预训练模型的实体识别智能标注方案:生成doccano要求json格式

    强烈推荐:数据标注平台doccano----简介.安装.使用.踩坑记录_汀.的博客-CSDN博客_doccano huggingface官网 参考:数据标注平台doccano----简介.安装.使用. ...

  10. 爆了!Sealos 三天支持 1000 个帕鲁私服

    Sealos 的帕鲁私服模板从第一天发布之后就起了 100 多个私服,第二天直接上到 500 多个,第三天直接上千,还在加速增长中.来讲讲我们只用一个晚上怎么做到上线一个专属可用区的,还有一些帕鲁实践 ...