数据加密

对称加密

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

常见的单密钥加密算法有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. [转帖]分享6个SQL小技巧

    https://www.jianshu.com/p/2fcf0a4e83b7   简介 经常有小哥发出疑问,SQL还能这么写?我经常笑着回应,SQL确实可以这么写.其实SQL学起来简单,用起来也简单, ...

  2. [转帖]Rust在windows下安装以后cargo build Error: linker `link.exe` not found

    D:\rust\runoob-greeting\greeting>cargo build error: linker `link.exe` not found | = note: 系统找不到指定 ...

  3. [转帖]超线程 Smt 究竟可以快多少?

    https://www.51cto.com/article/686171.html 刚才我们关闭SMT是把CPU10-CPU19全关了,只留下每对里面的1个CPU,也就是留下了CPU0-CPU9. 默 ...

  4. [转帖]Linux命令学习手册-readelf

    https://www.jianshu.com/p/405844abefae readelf elf-file(s) 功能 用于显示 elf 格式文件的信息. 描述 readelf 用来显示一个或者多 ...

  5. [转帖]SPEC-cpu2006的详细使用一键安装、手动安装。

    一.SPEC-cpu2006简介 SPEC CPU 2006 benchmark是SPEC新一代的行业标准化的CPU测试基准套件.重点测试系统的处理器,内存子系统和编译器. 说明:由于spec2006 ...

  6. Rendezvous hashing算法介绍

    Rendezvous hashing Rendezvous hashing用于解决分布式系统中的分布式哈希问题,该问题包括三部分: Keys:数据或负载的唯一标识 Values:消耗资源的数据或负载 ...

  7. prometheus告警规则分发服务

    Prometheus告警规则分发服务,根据一致性哈希将规则分发到多个节点,使用多个goroutine处理应用告警,在服务增加时可以增加goroutine,服务减少时降低goroutine数目. 规则下 ...

  8. Edge启动页面被篡改为hao123.com问题解决

    零:问题 当打开edge的时候,默认启动了hao123.com 壹:思路 在edge中设置启动页面为baidu.com 查看是否是快捷方式被篡改, 确定是否是电脑管家锁定了主页为hao123.com ...

  9. vue3.2新增指令v-memo的使用

    v-memo的讲解 vue3.2中新增了一个性能优化的指令: 这个指令就是v-memo; v-memo:可以做性能优化,v-memo中值若不发生变化,整个子树的更新会被跳过. <div v-me ...

  10. js文件下载blob

    使用axios文件下载 if (tableDataSource.selectedRowKeys.length > 0) { //本次请求你携带token axios.defaults.heade ...