学习go语言编程之安全编程
数据加密
对称加密
采用单密钥的加密算法,称为对称加密。
常见的单密钥加密算法有DES、AES、RC4等。
在对称加密中,私钥不能暴露,否则在算法公开的情况下,数据等同于明文。
非对称加密
采用双密钥的加密算法,称为非对称加密。
在该系统中,私钥和公钥都可以被用作加密或者解密,但是用私钥加密的明文,必须要用对应的公钥解密;用公钥加密的明文,必须用对应的私钥解密。
常见的双密钥加密算法有RSA等。
在非对称加密中,公钥是公开的,私钥是保密的。这样任何人都可以把自己的信息通过公钥和算法加密,然后发送给公钥的发布方,只有公钥发布方(公钥发布方拥有私钥)才能解开密文。
哈希加密
使用哈希算法可以实现加密后不可解密的需求。
哈希算法是一种从任意数据中创建固定长度摘要信息的办法,对于不同的数据,要求产生的摘要信息也是唯一的。
常见的哈希算法包括MD5、SHA-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提供了MD5、SHA-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语言编程之安全编程的更多相关文章
- 如何轻松学习C语言编程!
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- C、C++、Java到Python,编程入门学习什么语言好?
摘要:回顾编程语言几十年来的兴衰起伏,似乎也折射了整个信息产业的变迁消亡,想要在技术的洪流里激流勇进,找准并学精一两门编程语言更加显得至关重要. 最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C ...
- C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目
C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...
- 新手学习C语言/C++编程你所必须要了解的知识!从计算机原理开始!
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- GO学习-(19) Go语言基础之网络编程
Go语言基础之网络编程 现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其 ...
- 学习go语言编程系列之定义变量
package main import ( "fmt" "math") func main() { // 1. 定义变量名age,不初始化,使用对应类型的默认值 ...
- C语言与MATLAB接口 编程与实例 李传军编着
罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ************ ...
- C++程序设计教程学习(1)-第一部分 编程基础
第一章 概述 C++到底难不难学?没有学不会的事情 1.1 程序设计语言 语言 编程语言 人和计算机交流的工具,群体扩大,人人间交流过程描述与信息表达的工具 机器语言,汇编语言,高级语言 1.2 C+ ...
- go语言之行--网络编程、http处理流程详情
一.简介 go语言中的网络编程主要通过net包实现,net包提供了网络I/O接口,包括HTTP.TCP/IP.UDP.域名解析和Unix域socket等.和大多数语言一样go可以使用几行代码便可以启动 ...
- 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础
第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...
随机推荐
- [转帖]Oracle迁移到MySQL时数据类型转换问题
https://www.cnblogs.com/yeyuzhuanjia/p/17431979.html 最近在做"去O"(去除Oracle数据库)的相关工作,需要将Oracle表 ...
- [转帖]《Linux性能优化实战》笔记(五)—— 不可中断进程与僵尸进程
一. 进程状态 1. 状态含义 从 ps或者 top 命令的输出中,可以看到处于不同状态的进程 R:Running 或 Runnable,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行 D ...
- [转帖]TiKV读写流程浅析
https://www.cnblogs.com/luohaixian/p/15227838.html 1.TiKV框架图和模块说明 图1 TiKV整体架构图 1.1.各模块说明 PD Cluster ...
- [转帖]Skip List--跳表(全网最详细的跳表文章没有之一)
https://www.jianshu.com/p/9d8296562806 跳表是一种神奇的数据结构,因为几乎所有版本的大学本科教材上都没有跳表这种数据结构,而且神书<算法导论>.< ...
- [转帖]Linux之系统参数overcommit_memory
https://www.modb.pro/db/25980 前言:作为DBA,内存的使用情况是重要的监控指标之一,了解内存使用很重要.下面有一个系统参数,对于内存的调用起到重要的作用.大家可以了解一下 ...
- [转帖]计算机体系结构-cache高速缓存
https://zhuanlan.zhihu.com/p/482651908 本文主要介绍了cache的基本常识.基本组成方式.写入方法和替换策略,在基本组成方式和替换策略两节给出了较为详细的硬件实现 ...
- 【笔记】grafana v8.4.2 中如何设置曲线图的双坐标轴
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 这个话题当然很久就有人研究过了,只不过版本已经很老了,不适合新版本. 1 ...
- 【scikit-learn基础】--『回归模型评估』之准确率分析
分类模型的评估和回归模型的评估侧重点不一样,回归模型一般针对连续型的数据,而分类模型一般针对的是离散的数据. 所以,评估分类模型时,评估指标与回归模型也很不一样,比如,分类模型的评估指标通常包括准确率 ...
- springboot集成swagger之knife4j实战(升级版)
官方文档链接:https://doc.xiaominfo.com/ 一.Knifej和swagger-bootstrap-ui对比 Knife4j在更名之前,原来的名称是叫swagger-bootst ...
- el-select添加全部选项
/**给返回的搜索条件插入全部**/ global.addAll = function (list) { let addAllList = list addAllList.unshift({label ...