网络安全——认证与加密

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

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

k8s学习和实践:腾讯云轻量级服务器上搭建网站

Service类型 在 Kubernetes 中,Service 是一种抽象的概念,用于将一组 Pod 组织在一起,并为它们提供统一的访问入口。Service 可以通过一组稳定的 IP 地址和端口号,为其他容器或外部用户提供对这些 Pod 的访问。 为什么需要服务? pod的存在是短暂的,当pod因为节点故障或者人为原因下线的时候,ReplicationController可以上线一个新的pod。但是新的pod和原来的pod的IP是不相同的——为了解决不断变化的pod IP地址的问题,以及在一个固定的IP和端口对外暴露多个pod。 当一个服务被创建时,他会得到一个静态的IP,在服务的生命周期中这个IP不会发生变化。客户端应该通过这个固定IP地址连接到服务,而不是直接连接到pod。 服务的类型 Kubernetes 中的 Service 有以下四种类型: 1、ClusterIP 这是默认的 Service 类型,用于将 Service 暴露在集群内部。它为每个 Service 分配一个虚拟 IP 地址,可以通过该地址访问 Service 中的 Pod。ClusterIP 只能从集群内部访问,不能从集群外部访问。 2、NodePort 这种类型的 Service 将 Service 暴露到集群外部,通过将每个节点上的端口映射到 Service 上,可以让外部用户通过任意节点的 IP 地址和映射端口访问 Service 中的 Pod。NodePort 通常用于测试和开发环境,不太适合生产环境。 3、LoadBalancer 这种类型的 Service 可以将 Service 暴露到集群外部,并使用云提供商的负载均衡器将流量路由到 Service 中的 Pod。LoadBalancer 只能在云提供商支持的环境中使用,并且需要正确配置云提供商的负载均衡器才能正常工作。 4、ExternalName 这种类型的 Service 可以将 Service 暴露到集群外部,但它并不会创建任何代理或负载均衡器,而只是将 Service 映射到一个 DNS 名称。这可以让您在 Kubernetes 中使用外部服务,或者在不同的命名空间中重用服务。...

October 30, 2022 · 6 min · 1193 words · sirius1y

数据结构学习笔记

一、绪论 数据(data)是信息的载体,是描述客观事物的数、字符、图形、图像、声音以及所有能输入计算机中并被计算机程序识别和处理的符号的集合。 数据的最小单位的是数据项; 数据的基本单位是数据元素,一个数据元素可由若干个数据项组成。 数据结构分为两大类:线性结构和非线性结构 两类结构通常分为四类基本结构: 1)集合:结构中的数据元素之间同属于一个集合,此外没有其他关系; 2)线性结构:结构中的数据元素之间存在一种线性关系,一对一的关系; 3)树形结构:一对多的关系; 4)图形结构或网状结构:多对多的关系。 根据视点的不同又可分为:逻辑结构和物理结构: 逻辑结构:面向问题,描述数据元素之间的逻辑关系; 物理结构:又称存储结构,面向计算机,是数据结构在计算机中的表示(映像) 算法的特性:输入性、输出性、确定性、有穷性、有效性(可行性) 算法的标准:正确性(满足所要求界的问题的需求,最重要最基本)、可用性(便于用户使用,良好的界面、完备的用户文档)、可读性(易于理解)、效率(存储单元的开销和运行时间的耗费)、健壮性(对于非法数据的处理) 算法复杂度:(渐进)时间复杂度和空间复杂度 二、线性结构 1、线性表 1.1 顺序表示:顺序表 用顺序结构存储的线性表为顺序表(sequential list)。 顺序表一般用数组进行存储 类模板定义:T* elems,int length,int maxLength 1.2 链表表示 1) 单链表 分为带头结点和不带头结点的单链表; 带头结点的单链表相对不带头结点的单链表在涉及会更改头节点的任务时,操作会更加统一。 类模板定义: (结点)T data,Node* next (单链表)Node* head,int length 2) 双向循环链表 类模板定义: (结点)T data,Node* prior,Node* next (双向循环链表)Node* head,int length *带头结点的双向循环列表只有一个元素结点的条件:head->next!=head && head->next->next==head 3) 静态链表 利用数组来模拟存储空间实现链表。 类模板定义: (结点)T data,Node* next (静态链表)Node* head,Node* avail 设数组a放置了一个静态链表,当链表未使用的时候,其中所有的结点都是形成了一个链表,用avail进行管理,代表未使用的结点。 当进行插入操作的时候,就从avail中取出一个头节点,进行赋值,再放入head链表之中。 在完成每一步操作之后,记得要将next域中更改 插入元素操作: i=avail; avail=a[avail].next; a[i].next=a[head],next; a[head]。next=i; 当需要释放由j所指向的结点时,只需要把结点j放到avail表的最前端,并让avail指向它即可。...

October 26, 2022 · 19 min · 3943 words · sirius1y