网络安全——认证与加密

1. 加密与认证 任务 采用Java/Python语言编写一个较为完整的加密与认证程序,要求具有: 具有较完整的图形化界面; 使用MD5、SHA系列算法,实现消息摘要,确保消息的完整性; 使用DES、AES等算法实现对称加密,确保消息的机密性; 使用RSA算法,实现公钥加密,且用私钥解密,比较不对称加密和对称加密的性能; 实现基于数字证书的数字签名和验证(含证书的生成和创建); 1.1 消息摘要 1.1.1 消息摘要的作用 在网络安全目标中,要求信息在生成、存储或传输过程中保证不被偶然或蓄意地删除、修改、伪造、乱序、重放、插入等破坏和丢失,因此需要一个较为安全的标准和算法,以保证数据的完整性。 常见的消息摘要算法有: Ron Rivest设计的MD(Standard For Message Digest,消息摘要标准)算法 NIST设计的SHA(Secure Hash Algorithm,安全散列算法) 1.1.2 单向散列函数 1 特点 不定长的输入和定长的输出; 对于及其微小的变化,如1bit的变化,器哈希函数所产生的值也差异巨大; 对于不同的原像都有不同的映像,从散列值不可能推导出消息M ,也很难通过伪造消息M’来生成相同的散列值。 Hash函数的值称为作为自变量的消息的“散列值”或“消息摘要”、“数字指纹” 2 哈希函数的分类 1.根据安全水平 弱无碰撞 强无碰撞 ​ 注:强无碰撞自然含弱无碰撞! 2.根据是否使用密钥 带秘密密钥的Hash函数:消息的散列值由只有通信双方知道的秘密密钥K来控制,此时散列值称作MAC(Message Authentication Code) 不带秘密密钥的Hash函数:消息的散列值的产生无需使用密钥,此时散列值称作MDC(Message Detection Code) 3 哈希函数的应用 由Hash函数产生消息的散列值 以消息的散列值来判别消息的完整性 用加密消息的散列值来产生数字签名 用口令的散列值来安全存储口令(认证系统中的口令列表中仅存储口令的Hash函数值,以避免口令被窃取。认证时用输入口令的Hash函数值与其比较) 4 安全哈希函数的实现 输入数据分成L个长度固定为r的分组:M=(M1,M2,…,ML) 末组附加消息的长度值并通过填充凑足r位 压缩函数 f使用n位的链接变量Hi ,其初值H0=IV可任意指定 压缩函数 f的最后n位输出HL取作散列值 5 哈希函数:生日攻击 当哈希函数的输入位数太短的时候,就容易产生哈希碰撞,即出现两个原像对应用一个映像的问题。 生日问题 一个教室中至少有几个学生才能使有两个学生生日相同的概率不小于1/2; 等价于“球匣问题” 设J个球随机扔进N个匣子,存在一个匣子中至少有两个球的概率为p,则可以推导出: J2≈-2Nln(1-p)或 p≈ 1-e-J2/2/N 答案 将365个生日看作N=365个匣子,将学生看作球,p=0....

July 31, 2023 · 14 min · 2893 words · sirius1y

ping github.com

问题初现 在Windows上,挂了Clash,平时网页版的GitHub还是能正常跑的,因为平时开发主要是在Ubuntu上,所以git工具在Windows上用的不多。这次突发奇想,想把Windows和Ubuntu上的笔记整合到一个GitHub仓库上,并实现更新文件后自动拉取推送的功能,所以我现在Ubuntu上推送了一部分笔记到仓库中,再计划将Windows上的笔记也弄上去。 然后在配置Windows上的笔记文件夹Git环境,发现git老是报错ssh22端口连接超时。 我检查了: GitHub仓库上的SSH公钥配置,正常 Git的HTTP和HTTPS代理,正常 // 查看git有没有代理 git config --global -l // 配置git代理 git config --global http.proxy 127.0.0.1:7890 git config --global https.proxy 127.0.0.1:7890 // 取消git网络代理 git config --global --unset http.proxy git config --global --unset https.proxy 也想不通为啥,然后我就在博客园中看到了一篇文章:https://www.cnblogs.com/oldboyooxx/p/10387150.html 主要就是说:1、检查IP配置问题;2、检查防火墙状态 然后我就去ping github.com,发现ping不通,开代理不开代理都不行,怪! 我想起来可以通过改主机hosts的方式访问,https://www.cnblogs.com/xuexianqi/p/13219719.html,改了之后github.com就能ping通了。 再然后就发现SSH22端口超时的问题也解决了,然后就开始合并笔记了~ 脚本自动同步 对于笔记自动保存之后每次都要git手动提交未免也太麻烦了,然后我想试试通过一个git脚本来自动完成就好了。 git pull origin master git add . git commit -m "update" git push origin master 脚本的内容很简单啊,就是基础的这几步命令。 现在的问题就是怎么让他在保存文件的时候自动执行呢?而且希望如果同步的时候出错,能够把错误信息打印出来,可以是日志的方式。 人工办法:在写笔记之前进行一次脚本运行,写笔记,写完笔记之后,再运行一次脚本。 稍微聪明一点的办法:在打开和关闭文件夹/Typora的时候运行脚本。

July 30, 2023 · 1 min · 63 words · sirius1y

Go log库,encoding/json

log Go语言内置的log包实现了简单的日志服务。本文介绍了标准库log的基本使用。 Go内置的log库功能有限,例如无法满足记录不同级别日志的情况,我们在实际的项目中根据自己的需要选择使用第三方的日志库,如logrus、zap等。 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic|Panicf|Panicln)来使用,比自行创建一个logger对象更容易使用。 例如,我们可以像下面的代码一样直接通过log包来调用上面提到的方法,默认它们会将日志信息打印到终端界面: package main import ( &quot;log&quot; ) func main() { log.Println(&quot;这是一条很普通的日志。&quot;) v := &quot;很普通的&quot; log.Printf(&quot;这是一条%s日志。\n&quot;, v) log.Fatalln(&quot;这是一条会触发fatal的日志。&quot;) log.Panicln(&quot;这是一条会触发panic的日志。&quot;) } 编译并执行上面的代码会得到如下输出: 2017/06/19 14:04:17 这是一条很普通的日志。 2017/06/19 14:04:17 这是一条很普通的日志。 2017/06/19 14:04:17 这是一条会触发fatal的日志。 logger会打印每条日志信息的日期、时间,默认输出到系统的标准错误。Fatal系列函数会在写入日志信息后调用os.Exit(1)。Panic系列函数会在写入日志信息后panic。 配置logger 标准logger的配置 默认情况下的logger只会提供日志的时间信息,但是很多情况下我们希望得到更多信息,比如记录该日志的文件名和行号等。log标准库中为我们提供了定制这些设置的方法。 log标准库中的Flags函数会返回标准logger的输出配置,而SetFlags函数用来设置标准logger的输出配置。 func Flags() int func SetFlags(flag int) flag选项 log标准库提供了如下的flag选项,它们是一系列定义好的常量。 const ( // 控制输出日志信息的细节,不能控制输出的顺序和格式。 // 输出的日志在每一项后会有一个冒号分隔:例如2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message Ldate = 1 << iota // 日期:2009/01/23 Ltime // 时间:01:23:23 Lmicroseconds // 微秒级别的时间:01:23:23.123123(用于增强Ltime位) Llongfile // 文件全路径名+行号: /a/b/c/d....

June 22, 2023 · 2 min · 332 words · sirius1y

Go学习笔记

配置 Go 工作区 继续之前,请务必仔细阅读此部分。 Go 在组织项目文件方面与其他编程语言不同。 首先,Go 是在工作区的概念下工作的。 工作区就是应用程序源代码所在的位置。 所有 Go 项目共享同一个工作区。 不过,从版本 1.11 开始,Go 已开始更改此方法。 你尚且不必担心,因为我们将在下一个模块中介绍工作区。 现在,Go 工作区位于 $HOME/go,但如果需要,可以为所有项目设置其他位置。 若要将工作区设置为其他位置,可以使用 $GOPATH 环境变量。 在处理更复杂的项目时,此环境变量有助于避免将来出现问题。 Go 工作区文件夹 每个 Go 工作区都包含三个基本文件夹: bin:包含应用程序中的可执行文件。 src:包括位于工作站中的所有应用程序源代码。 pkg:包含可用库的已编译版本。 编译器可以链接这些库,而无需重新编译它们。 例如,工作站文件夹结构树可能与下面的示例类似: bin/ hello coolapp pkg/ github.com/gorilla/ mux.a src/ github.com/golang/example/ .git/ hello/ hello.go Go实战经验 在命令行中输入’code . ‘会唤起VS code编辑当前目录 源码规范 可执行文件都要包含在package main中 import的包必须都要使用,否则报错不进行编译;vs code中保存文件就会自动调整文件格式,并且删除未使用的import 整个package main中只能有一个func main() 变量的声明和初始化 Go是强类型语言,声明的每个变量都绑定到特定的数据类型,并且只接受与此类型匹配的值。 变量声明的方式有很多,格式和其他语言不太一样 最普通的方式:var 变量名称 变量类型 Go也可以像Python那样自动推断变量的类型,有些时候可以不用加类型名称 最常用的方式(只适用于在函数内,声明并初始化一个新的变量):使用冒号等号 age := 32 注意,在函数体外还是只能用var的方式声明和初始化变量 // 变量声明 // 变量声明了必须要使用,否则编译不通过 var first string var second, third string var age int = 1 var ( fisrtly int = 1 secondly string = 2 thirdly = "123" ) var firstName, secondName, agenumber = "123", "456", 32 // 最常见的声明方式 冒号等于号 := 用于声明并初始化变量,不能用于常量的声明 firstName_, secondName_, age_ := "123", "456", 32 // 常量声明f const HTTPstatusOK = 200 const ( StatusOK = 0 StatusConnectionReset = 1 StatusOtherError = 2 ) 数据类型 基本类型:数字、字符串、布尔值 聚合类型:数组、结构体 引用类型:指针、切片、映射、函数、通道 接口类型:接口 基本类型 在 Go 中,如果你不对变量初始化,所有数据类型都有默认值。...

June 20, 2023 · 5 min · 904 words · sirius1y

CSRF攻击

简介 CSRF攻击利用了受害者已经通过身份验证并且在一个网站上建立的有效会话,来执行未经授权的操作。当受害者在一个网站上登录并获得一个会话(例如通过使用用户名和密码进行身份验证),该网站会为其分配一个令牌或会话ID,以便在后续的请求中验证用户的身份。 CSRF攻击者会通过诱使受害者访问一个恶意网站或点击恶意链接,来利用受害者的已验证会话。由于受害者在浏览器中仍然保持着有效会话,攻击者可以构造特制的请求,以利用该会话来执行恶意操作,而这些操作是受害者并不知情或未经授权的。 例如,假设受害者在银行网站上登录并建立了一个有效的会话。攻击者可以通过电子邮件或社交媒体发送一个包含恶意链接的消息给受害者。如果受害者点击了该链接,他们的浏览器将自动向银行网站发送一个请求,而这个请求中包含了受害者的有效会话信息。银行网站在验证会话时会认为这个请求是合法的,因为会话是有效的,所以它执行了该请求所代表的操作,如转账、修改账户信息等,而受害者是毫不知情的。 CSRF攻击的目标是利用受害者的已验证会话来执行攻击者所期望的未经授权操作,从而导致受害者的损失或者对系统的安全产生威胁。 补充知识 cookie 一般情况下,cookie是以键值对进行表示的(key-value),例如name=jack,这个就表示cookie的名字是name,cookie携带的值是jack。 cookie有2种存储方式,一种是会话性,一种是持久性。 会话性:如果cookie为会话性,那么cookie仅会保存在客户端的内存中,当我们关闭客服端时cookie也就失效了 持久性:如果cookie为持久性,那么cookie会保存在用户的硬盘中,直至生存期结束或者用户主动将其销毁。 组成 (1)cookie名称 (2)cookie值 (3)Expires:过期时间。当过了过期时间后,浏览器会将该cookie删除。如果不设置Expires,则关闭浏览器后该cookie失效。 (4)Path:用来设置在路径下面的页面才可以访问该cookie,一般设为/,以表示同一站点的所有页面都可以访问该cookie。 (5)Domain:用来指定哪些子域才可以访问cookie,格式一般为“.XXX.com” (6)Secure:如果设置了secure没有值,则代表只有使用HTTPS协议才可以访问 (7)HttpOnly:如果在cookie中设置了HttpOnly属性,那么通过JavaScript脚本等将无法读取到cookie信息。 URL URL(统一资源定位符)的一般格式如下: scheme://host:port/path?query_parameters#fragment_identifier 具体解释如下: Scheme(协议):指定用于访问资源的协议,例如HTTP、HTTPS、FTP等。它是URL的开头部分,通常以双斜杠(//)结尾。 Host(主机):指定目标资源所在的主机名或IP地址。主机名可以是域名(例如example.com)或IP地址(例如192.168.0.1)。 Port(端口):指定用于访问目标资源的端口号(可选)。默认的端口号根据协议而不同,如HTTP默认端口是80,HTTPS默认端口是443。如果URL中没有指定端口,将使用默认端口。 Path(路径):指定资源在服务器上的路径(可选)。路径部分是指服务器上资源的具体位置,可以是文件路径或目录路径。 Query Parameters(查询参数):包含在URL中的键值对参数(可选)。查询参数通常用于向服务器传递额外的信息,多个参数之间使用"&“符号分隔。 Fragment Identifier(片段标识符):用于标识文档中的特定片段(可选)。片段标识符通常由一个锚点或特定位置的标识符组成,用于在文档中导航到指定位置。 实验过程 使用Flask框架进行构建web应用。 文件架构 ├── web-csrf/ │ ├── webA.py │ ├── webB.py │ ├── templates/ │ │ ├── home.html │ │ ├── login.html │ └── static/ │ └── style.css 源码 webA: # webA.py import hashlib import re import mysql.connector from flask import Flask, request, render_template, make_response app = Flask(__name__) db = mysql....

May 21, 2023 · 4 min · 800 words · sirius1y