一、引言

这篇文章来介绍一下信息安全方面的知识,本人的上一份工作就是做安全相关的产品,在这里对产品的的大体思路简单描述一下吧。

用户提供一些基本信息,比如姓名、手机号、身份证号码等,我们将这些基本信息录入平台。当用户安装集成了我们SDK的App后,App通过接口向我们平台发起申请证书的申请,而我们则会携带用户的信息向CA申请证书。(如果不懂,文章后续会有介绍)

当CA给用户生成证书后,我们通过接口向App返回,App再调用我们提供的SDK,往SIM卡里写入证书。证书能干吗呢?我们可以用证书来对文件签名,我们还可以用证书对数据进行加密,我们还可以用证书对文件进行签章……等等一系列的安全操作。

这里面就设计信息安全方方面面的知识,基于此,下面就来介绍一下密码学方法的知识吧。

二、密码学

密码学是网络安全、信息安全、区块链等技术的基础,常见的非对称加密、对称加密、散列函数等,都属于密码学范畴。

1、古典密码学
(1) 替换法

替换法就是用固定的信息将原文替换成无法直接阅读的密文信息。例如我们要加密 bee 这个单词,我们可以将 b 替换成 w ,e 替换成p ,这样 bee 单词就变换成了wpp,不知道替换规则的人就无法阅读出原文的含义。

替换法有单表替换和多表替换两种形式。单表替换即只有一张原文密文对照表单,发送者和接收者用这张表单来加密解密。多表替换即有多张原文密文对照表单,不同字母可以用不同表单的内容替换。

例如约定好表单为:表单 1:abcde-swtrp 、表单2:abcde-chfhk 、表单 3:abcde-jftou。

规定第一个字母用第三张表单,第二个字母用第一张表单,第三个字母用第二张表单,这时 bee 单词就变成了(312)fpk ,破解难度更高,其中 312 又叫做密钥,密钥可以事先约定好,也可以在传输过程中标记出来。

(2)移位法

移位法就是将原文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后得出密文,典型的移位法应用有 “ 恺撒密码 ”。(最多可移25位)

例如约定好向后移动2位(abcde - cdefg),这样 bee 单词就变换成了dgg 。

同理替换法,移位法也可以采用多表移位的方式,典型的多表案例是“维尼吉亚密码”(又译维热纳尔密码),属于多表密码的一种形式。

(3)古典密码破解方式

古典密码虽然很简单,但是在密码史上是使用的最久的加密方式,直到“概率论”的数学方法被发现,古典密码就被破解了。

英文单词中字母出现的频率是不同的,e以12.702%的百分比占比最高,z 只占到0.074%,感兴趣的可以去百科查字母频率详细统计数据。如果密文数量足够大,仅仅采用频度分析法就可以破解单表的替换法或移位法。

多表的替换法或移位法虽然难度高一些,但如果数据量足够大的话,也是可以破解的。以维尼吉亚密码算法为例,破解方法就是先找出密文中完全相同的字母串,猜测密钥长度,得到密钥长度后再把同组的密文放在一起,使用频率分析法破解。

2、 近代密码学

古典密码的安全性受到了威胁,外加使用便利性较低,到了工业化时代,近现代密码被广泛应用。

恩尼格玛机是二战时期纳粹德国使用的加密机器,后被英国破译,参与破译的人员有被称为计算机科学之父、人工智能之父的图灵。

恩尼格玛机使用的加密方式本质上还是移位和替代,只不过因为密码表种类极多,破解难度高,同时加密解密机器化,使用便捷,因而在二战时期得以使用。

3、现代密码学
(1)散列函数

散列函数,也叫杂凑函数、摘要函数或哈希函数,可将任意长度的消息经过运算,变成固定长度数值,常见的有MD5、SHA-1、SHA256,多应用在文件校验,数字签名中。

MD5 可以将任意长度的原文生成一个128位(16字节)的哈希值;SHA-1可以将任意长度的原文生成一个160位(20字节)的哈希值
(2)对称密码

对称密码应用了相同的加密密钥和解密密钥。对称密码分为:序列密码(流密码),分组密码(块密码)两种。流密码是对信息流中的每一个元素(一个字母或一个比特)作为基本的处理单元进行加密,块密码是先对信息流分块,再对每一块分别加密。

例如原文为1234567890,流加密即先对1进行加密,再对2进行加密,再对3进行加密……最后拼接成密文;块加密先分成不同的块,如1234成块,5678成块,90XX(XX为补位数字)成块,再分别对不同块进行加密,最后拼接成密文。前文提到的古典密码学加密方法,都属于流加密,也是逐个加密。

(3)非对称密码

对称密码的密钥安全极其重要,加密者和解密者需要提前协商密钥,并各自确保密钥的安全性,一但密钥泄露,即使算法是安全的也无法保障原文信息的私密性。

在实际的使用中,远程的提前协商密钥不容易实现,即使协商好,在远程传输过程中也容易被他人获取,因此非对称密钥此时就凸显出了优势。

非对称密码有两支密钥,公钥(publickey)和私钥(privatekey),加密和解密运算使用的密钥不同。用公钥对原文进行加密后,需要由私钥进行解密;用私钥对原文进行加密后(此时一般称为签名),需要由公钥进行解密(此时一般称为验签)。公钥可以公开的,大家使用公钥对信息进行加密,再发送给私钥的持有者,私钥持有者使用私钥对信息进行解密,获得信息原文。因为私钥只有单一人持有,因此不用担心被他人解密获取信息原文。

此处需要解释一下:

私钥是只有一个人持有,所以用私钥加密后的信息是可以做身份认证的,也叫做不可抵赖性。

这里提出一个问题?小明和小红两个人如何用非对称加密算法进行安全通信?

提示:小明和小红各自生成自己的公私钥对,分别把公钥给到对方,即可安全通信。

4、ASCII编码

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。

(1)、字符转换成ascii码
public class AsciiDemo {public static void main(String[] args) {char a = 'A';int b = a;// 打印ascii码System.out.println(b);}
}

运行程序

(2)、字符串转换成ascii码
public class AsciiDemo {public static void main(String[] args) {String a = "AaZ";// 获取ascii码,需要把字符串转成字符char[] chars = a.toCharArray();for (char c : chars) {int asciiCode = c;System.out.println(asciiCode);}}
}

运行程序

5、恺撒加密

在密码学中,恺撒密码是一种最简单且最广为人知的加密技术。

凯撒密码最早由古罗马军事统帅盖乌斯·尤利乌斯·凯撒在军队中用来传递加密信息,故称凯撒密码。这是一种位移加密方式,只对26个字母进行位移替换加密,规则简单,容易破解。下面是位移1次的对比:

将明文字母表向后移动1位,A变成了B,B变成了C……,Z变成了A。同理,若将明文字母表向后移动3位:

则A变成了D,B变成了E……,Z变成了C。

字母表最多可以移动25位。凯撒密码的明文字母表向后或向前移动都是可以的,通常表述为向后移动,如果要向前移动1位,则等同于向后移动25位,位移选择为25即可。

它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。

这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

恺撒密码通常被作为其他更复杂的加密方法中的一个步骤。

简单来说就是当秘钥为n,其中一个待加密字符ch,加密之后的字符为ch+n,当ch+n超过’z’时,回到’a’计数。

6、 频度分析法破解恺撒加密

频率分析解密法,以英文字母为例,为了确定每个英文字母的出现频率,分析一篇或者数篇普通的英文文章,假设英文字母出现频率最高的是e,接下来是t,然后是a……,然后检查要破解的密文,也将每个字母出现的频率整理出来,假设密文中出现频率最高的字母是j,那么就可能是e的替身,如果密码文中出现频率次高的但是p,那么可能是t的替身,以此类推便就能解开加密信息的内容。这就是频率分析法。

7、 Byte和bit

Byte : 字节。 数据存储的基本单位,比如移动硬盘1T ,单位是byte。

bit : 比特, 又叫位。一个位要么是0要么是1,数据传输的单位 , 比如家里的宽带100MB,下载速度并没有达到100MB,一般都是12-13MB,那么是因为需要使用 100 / 8

关系: 1Byte = 8bit

(1)、获取字符串byte
public class ByteBit {public static void main(String[] args) {String a = "a";byte[] bytes = a.getBytes();for (byte b : bytes) {int c=b;// 打印发现byte实际上就是ascii码System.out.println(c);}}
}

运行程序

(2)、 byte对应bit
public class ByteBit {public static void main(String[] args) {String a = "a";byte[] bytes = a.getBytes();for (byte b : bytes) {int c = b;// 打印发现byte实际上就是ascii码System.out.println(c);// 我们在来看看每个byte对应的bit,byte获取对应的bitString s = Integer.toBinaryString(c);System.out.println(s);}}
}

打印出来应该是8个bit,但前面是0,没有打印 ,从打印结果可以看出来,一个英文字符 ,占一个字节

(3)、 中文对应的字节

中文在GBK编码下, 占据2个字节;中文在UTF-8编码下, 占据3个字节

public class ByteBitDemo {public static void main(String[] args) throws Exception{String a = "中";byte[] bytes = a.getBytes();for (byte b : bytes) {System.out.print(b + "   ");String s = Integer.toBinaryString(b);System.out.println(s);}}
}

运行程序:我们发现一个中文是有 3 个字节组成

我们修改 编码格式 , 编码格式改成 GBK ,我们在运行发现变成了 2 个字节

public static void main(String[] args) throws Exception{String a = "中";// 在中文情况下,不同的编码格式,对应不同的字节// GBK :编码格式占2个字节// UTF-8:编码格式占3个字节byte[] bytes = a.getBytes("GBK");// byte[] bytes = a.getBytes("UTF-8");for (byte b : bytes) {System.out.print(b + "   ");String s = Integer.toBinaryString(b);System.out.println(s);}}

8、常见加密方式

(1)对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

假如,我们现在有一个原文3要发送给B,设置密钥为108, 3 * 108 = 324, 将324作为密文发送给B
B拿到密文324后, 使用324/108 = 3 得到原文。

常见对称加密算法

==DES ==: Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。

==AES ==: Advanced Encryption Standard, 高级加密标准。在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

对称加密算法特点:

  1. 加密速度快, 可以加密大文件
  2. 密文可逆, 一旦密钥文件泄漏, 就会导致数据暴露
  3. 加密后编码表找不到对应字符, 出现乱码
  4. 一般结合Base64使用

DES加密示例代码

Cipher 文档地址

https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html#getInstance-java.lang.String

public class DesAesDemo {public static void main(String[] args) throws Exception{// 原文String input = "中国";// des加密必须是8位String key = "123456";// 算法String algorithm = "DES";String transformation = "DES";// Cipher:密码,获取加密对象// transformation:参数表示使用什么类型加密Cipher cipher = Cipher.getInstance(transformation);// 指定秘钥规则// 第一个参数表示:密钥,key的字节数组// 第二个参数表示:算法SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);// 对加密进行初始化// 第一个参数:表示模式,有加密模式和解密模式// 第二个参数:表示秘钥规则cipher.init(Cipher.ENCRYPT_MODE,sks);// 进行加密byte[] bytes = cipher.doFinal(input.getBytes());// 打印字节,因为ascii码有负数,解析不出来,所以乱码
//        for (byte b : bytes) {//            System.out.println(b);
//        }// 打印密文System.out.println(new String(bytes));}
}


DES加密算法规定,密钥key必须是8个字节。

修改 密钥 key = “12345678” ,再次运行 ,出现乱码是因为对应的字节出现负数,但负数,没有出现在 ascii 码表里面,所以出现乱码,需要配合base64进行转码。

使用 base64 进行编码,base64 导包的时候,需要注意 ,别导错了,需要导入 apache 包。

public class DesAesDemo {public static void main(String[] args) throws Exception{// 原文String input = "中国";// des加密必须是8位String key = "123456";// 算法String algorithm = "DES";String transformation = "DES";// Cipher:密码,获取加密对象// transformation:参数表示使用什么类型加密Cipher cipher = Cipher.getInstance(transformation);// 指定秘钥规则// 第一个参数表示:密钥,key的字节数组// 第二个参数表示:算法SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);// 对加密进行初始化// 第一个参数:表示模式,有加密模式和解密模式// 第二个参数:表示秘钥规则cipher.init(Cipher.ENCRYPT_MODE,sks);// 进行加密byte[] bytes = cipher.doFinal(input.getBytes());// 打印字节,因为ascii码有负数,解析不出来,所以乱码
//        for (byte b : bytes) {//            System.out.println(b);
//        }String encode = Base64.encode(bytes);// 打印密文System.out.println(encode );}
}

DES解密示列代码

public class DesDemo {// DES加密算法,key的大小必须是8个字节public static void main(String[] args) throws Exception {String input ="中国";// DES加密算法,key的大小必须是8个字节String key = "12345678";String transformation = "DES"; // 指定获取密钥的算法String algorithm = "DES";String encryptDES = encryptDES(input, key, transformation, algorithm);System.out.println("加密:" + encryptDES);String s = decryptDES(encryptDES, key, transformation, algorithm);System.out.println("解密:" + s);}/*** 使用DES加密数据** @param input          : 原文* @param key            : 密钥(DES,密钥的长度必须是8个字节)* @param transformation : 获取Cipher对象的算法* @param algorithm      : 获取密钥的算法* @return : 密文* @throws Exception*/private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception {// 获取加密对象Cipher cipher = Cipher.getInstance(transformation);// 创建加密规则// 第一个参数key的字节// 第二个参数表示加密算法SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);// ENCRYPT_MODE:加密模式// DECRYPT_MODE: 解密模式// 初始化加密模式和算法cipher.init(Cipher.ENCRYPT_MODE,sks);// 加密byte[] bytes = cipher.doFinal(input.getBytes());// 输出加密后的数据String encode = Base64.encode(bytes);return encode;}/*** 使用DES解密** @param input          : 密文* @param key            : 密钥* @param transformation : 获取Cipher对象的算法* @param algorithm      : 获取密钥的算法* @throws Exception* @return: 原文*/private static String decryptDES(String input, String key, String transformation, String algorithm) throws Exception {// 1,获取Cipher对象Cipher cipher = Cipher.getInstance(transformation);// 指定密钥规则SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);cipher.init(Cipher.DECRYPT_MODE, sks);// 3. 解密,上面使用的base64编码,下面直接用密文byte[] bytes = cipher.doFinal(Base64.decode(input));//  因为是明文,所以直接返回return new String(bytes);}
}
9、Base64 算法简介

Base64是网络上最常见的用于传输8Bit字节码的可读性编码算法之一。可读性编码算法不是为了保护数据的安全性,而是为了可读性,可读性编码不改变信息内容,只改变信息内容的表现形式。

所谓Base64,即是说在编码过程中使用了64种字符:大写A到Z、小写a到z、数字0到9、“+”和“/”。

Base58是Bitcoin(比特币)中使用的一种编码方式,主要用于产生Bitcoin的钱包地址,相比Base64,Base58不使用数字"0",字母大写"O",字母大写"I",和字母小写"i",以及"+“和”/"符号。

Base64 算法原理

base64 是 3个字节为一组,一个字节 8位,一共 就是24位 ,然后,把3个字节转成4组,每组6位,3 * 8 = 4 * 6 = 24 ,每组6位,缺少的2位,会在高位进行补0 ,这样做的好处在于 ,base取的是后面6位,去掉高2位 ,那么base64的取值就可以控制在0-63位了,所以就叫base64。

base64 构成原则,如下图。

① 小写 a - z = 26个字母

② 大写 A - Z = 26个字母

③ 数字 0 - 9 = 10 个数字

④ + / = 2个符号

大家可能发现一个问题,咱们的base64有个 = 号,但是在映射表里面没有发现 = 号 , 这个地方需要注意,等号非常特殊,因为base64是三个字节一组 ,如果当我们的位数不够的时候,会使用等号来补齐。

10、 AES加密解密

AES 加密解密和 DES 加密解密代码一样,只需要修改加密算法就行。

public class AesDemo {// DES加密算法,key的大小必须是8个字节public static void main(String[] args) throws Exception {String input ="中国";// AES加密算法,比较高级,所以key的大小必须是16个字节String key = "1234567812345678";String transformation = "AES"; // 指定获取密钥的算法String algorithm = "AES";// 先测试加密,然后在测试解密String encryptDES = encryptDES(input, key, transformation, algorithm);System.out.println("加密:" + encryptDES);String s = dncryptDES(encryptDES, key, transformation, algorithm);System.out.println("解密:" + s);}/*** 使用DES加密数据** @param input          : 原文* @param key            : 密钥(DES,密钥的长度必须是8个字节)* @param transformation : 获取Cipher对象的算法* @param algorithm      : 获取密钥的算法* @return : 密文* @throws Exception*/private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception {// 获取加密对象Cipher cipher = Cipher.getInstance(transformation);// 创建加密规则// 第一个参数key的字节// 第二个参数表示加密算法SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);// ENCRYPT_MODE:加密模式// DECRYPT_MODE: 解密模式// 初始化加密模式和算法cipher.init(Cipher.ENCRYPT_MODE,sks);// 加密byte[] bytes = cipher.doFinal(input.getBytes());// 输出加密后的数据String encode = Base64.encode(bytes);return encode;}/*** 使用DES解密** @param input          : 密文* @param key            : 密钥* @param transformation : 获取Cipher对象的算法* @param algorithm      : 获取密钥的算法* @throws Exception* @return: 原文*/private static String dncryptDES(String input, String key, String transformation, String algorithm) throws Exception {// 1,获取Cipher对象Cipher cipher = Cipher.getInstance(transformation);// 指定密钥规则SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);cipher.init(Cipher.DECRYPT_MODE, sks);// 3. 解密byte[] bytes = cipher.doFinal(Base64.decode(input));return new String(bytes);}
}

AES 加密的密钥key , 需要传入16个字节

11、toString()与new String ()用法区别
public class TestBase64 {public static void main(String[] args) {String str = "TU0jV0xBTiNVYys5bEdiUjZlNU45aHJ0bTdDQStBPT0jNjQ2"+ "NDY1Njk4IzM5OTkwMDAwMzAwMA==";String rlt1 = new String(Base64.decode(str));String rlt2 = Base64.decode(str).toString();System.out.println(rlt1);System.out.println(rlt2);}
}

结果是:

MM#WLAN#Uc+9lGbR6e5N9hrtm7CA+A==#646465698#399900003000
[B@1540e19d

toString()与new String ()用法区别

str.toString是调用了这个object对象的类的toString方法。一般是返回这么一个String:[class name]@[hashCode]

new String(str)是根据parameter是一个字节数组,使用java虚拟机默认的编码格式,将这个字节数组decode为对应的字符。若虚拟机默认的编码格式是ISO-8859-1,按照ascii编码表即可得到字节对应的字符。

什么时候用什么方法呢?

new String()一般使用字符转码的时候,byte[]数组的时候
toString()对象打印的时候使用

12、加密模式

加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html

ECB : Electronic codebook, 电子密码本。需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密

优点 : 可以并行处理数据
缺点 : 同样的原文生成同样的密文, 不能很好的保护数据
同时加密,原文是一样的,加密出来的密文也是一样的

CBC : Cipher-block chaining, 密码块链接。每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。

优点 : 同样的原文生成的密文不一样
缺点 : 串行处理数据.

13、填充模式

当需要按块处理的数据, 数据长度不符合块处理需求时, 按照一定的方法填充满块长的规则

NoPadding

不填充
在DES加密算法下, 要求原文长度必须是8byte的整数倍
在AES加密算法下, 要求原文长度必须是16byte的整数倍

PKCS5Padding

数据块的大小为8位, 不够就补足

Tips

默认情况下, 加密模式和填充模式为 : ECB/PKCS5Padding
如果使用CBC模式, 在初始化Cipher对象时, 需要增加参数, 初始化向量IV :
IvParameterSpec iv = new IvParameterSpec(key.getBytes());

信息安全——密码学(上)相关推荐

  1. 计算机信息安全密码学研究,密码学是对信息安全各方面的研究,能够解决所有信息安全的问题。() - 试题答案网问答...

    相关题目与解析 密码学作为信息安全的关键技术,其安全目标主要包括三个非常重要的方面:保密性.完整性和可用性.()是指所有资源只能由授权方式以授权的方式进行修改,即信息未经授权不能进行改变的特性. 密码 ...

  2. 质数(素数) 与 加密(密码学上的应用)

    --- ■定义 素数,一个大于1的自然数, 只能被1和他本身整除的数. 最小的素数是2 ■扩展1 哥德巴赫1742年给欧拉的信中哥德巴赫提出了以下猜想:任一大于2的整数都可写成三个质数之和 欧拉的版本 ...

  3. 当信息安全遇上数字化转型

    当信息安全遇上数字化转型 作者长期从事信息安全工作,在企业任职信息安全负责人.副高级职称,拥有众多国际安全领域证书CISSP.CDE.PCNSE.CCSE--紧跟信息化时代的发展与演进,近期通过了EX ...

  4. 创业公司如何做好信息安全(上)

    缘起 在IC咖啡分享会的时候,有人问到了这个问题,关于创业公司,在资金和技术短缺的情况下,如何做好信息安全呢? 这真是个好问题,我觉得有必要单开一篇. 很抱歉的是,其实在这个领域我自己做的也不够好,甚 ...

  5. 信息安全——密码学之DES介绍

      今天本想写一篇有关des算法的简介,无意中发现圈主已经完成了一篇,自认为无法写的更为详细具体.于是便略加补充后搬来了这里,希望大家不要怪游魂太懒惰. 密码技术是防止信息泄漏的技术,是信息安全技术中 ...

  6. 信息安全密码学实验四:Diffie-Hellman密钥交换协议的设计与实现

    一.实验目的 理解Diffie-Hellman算法的实现原理,编程实现Diffie-Hellman算法的程序,能够实现密钥协商的目的 二.实验原理 w.Diffie与M.Hellman在1976年提出 ...

  7. 信息安全密码学实验三:密码学数学基础实验

    一. 实验目的 掌握密码学相关的数学基础知识,理解模幂.求逆等运算的过程,编程实现相关算法 二.实验原理 考虑模指数,即计算形如 x^c mod n 的函数,在RSA密码体制中,加密和解密运算都是模指 ...

  8. 信息安全—密码学信息熵信息理论基础—熵的概念(熵、联合熵、条件熵、平均互信息)

    数学基础:概率论乘法法则 两个事件相互独立:P(A∩B) = P(A)×P(B) · 意思是事件A和事件B同时发生的概率 = 事件A发生的概率 × 事件B发生的概率 · · 举个栗子:掷两枚硬币硬币同 ...

  9. 信息安全密码学:DES算法的核心 E盒、S盒、P盒

    加密密钥等于脱密密钥,或者由一个可以轻易的计算出另一个的密码体制,称为单密钥密码体制,亦或称为对称密码体制或传统密码体制.其最具代表意义的当然属于DES密码体制了. 1.DES的设计背景 1973年5 ...

  10. 信息安全文件上传漏洞upload-labs第21关详解

    正文部分分为两部分:1.过关流程,2.流程分析 本关涉及知识点: 1.一定的代码审计能力 2.数组验证 3.文件名/.上传绕过(例如a.php/.上传到目录后就变成了a.php,这是由于文件名无法识别 ...

最新文章

  1. 使用mvn生成webapp失败,尚未找到原因
  2. 从golang-gin-realworld-example-app项目学写httpapi (四)
  3. sicp 2.3-2.5 习题
  4. 从零開始学androidlt;TabHost标签组件.二十九.gt;
  5. cpu风扇声音大_小米游戏本风扇声音大的处理方法
  6. redis中数据类型的使用,并发问题,list重复插入问题,redis使用实例-简单消息队列和排名统计
  7. 计算机桌面任务栏过宽怎么处理,任务栏变宽了怎么办 还原变宽任务栏的方法【图文教程】...
  8. 如何使用Python实现一个pdf阅读器?
  9. 腾讯MSDK手Q微信授权登录
  10. 手机拍证件照的工具哪个好用
  11. 【毕设项目】基于单片机的遥控小车设计与实现 - 嵌入式 物联网 stm32 c51
  12. 面试管:用了HTTPS就安全了吗?HTTPS 会被抓包吗?
  13. USB3.0扩展坞集线器Hub引起鼠标卡顿飘解决方法
  14. matlab 播放声音,用matlab录音和放音
  15. 2、selenium原理和启动浏览器(Chromoption类)
  16. OpenVpnCentos8部署
  17. 【学术会议】如何rebuttal学术论文?
  18. VaR如何计算?VaR计算方法
  19. android 分享wifi app下载安装,WiFi共享精灵移动版下载
  20. 概率论考点总结类型3 概率不等式

热门文章

  1. Unity3d 给人物模型添加动画
  2. 华为电脑和手机一碰传_体验华为“一碰传”高科技,实现手机和电脑互传文件...
  3. 日本战国武将绰号与称号一览表
  4. 【复习笔记】计算机网络求职考点整理
  5. steam计算机游戏,steam五款免费游戏推荐  整体品质不输付费游戏 千万不要错过...
  6. Scanner类、Random类、ArrayList 类
  7. 5-大数据分析之 druid 介绍
  8. 医学通识50讲学习笔记(4)--疾病和症状
  9. 2021正睿noip十连day2
  10. Hyperledger Explorer部署