密码学:
大家晚上好,我是卢卡,这期主要是来了解一下密码学的知识,其实这期呢也是给大家长见识的篇目,为了更好的了解密码的面目,我们每天都在进行登录操作,比如抖音、微博以及很多的软件,第一次登录软件,都会要求登录账号,其实登录操作--就是为了捕捉用户,固定用户信息,从而进行权限控制。 每个软件都会有相应的功能特点,比如抖音做短视频,用户通过发送短视频,别的用户通过查看,比如评论权限,这都是通过用户账号,然后获取的同步信息,以及我们每次鉴权登录的 Token
数据解密真的太难了
密码的前世今生
古代加密:
使用药水,或者是移位法,比如遇水显示,特殊的符号记录,暗号等;
现代加密:
显著特点是,加密和解密的秘钥不同 分为公钥和私钥两个
如何设置密码才安全:
1.密码不要太常见,简单密码不要,比如是 123456789
2.各个软件的密码不要设置一样的,防止攻击者通过撞库
3.设置密码加一些特殊的标记,比如京东、淘宝,微信的字母,
英文密码的起源
古罗马的人凯撒大帝,发明了最初的加密英文算法,
凯撒加密和解密:
利用英文字母的,想左右移动,最多移动 25 位置,破解
举个例子:
package com.atlucas;
/** * 凯撒加密,位移法 */public class KasirDemo {
public static void main(String[] args) { //确定原文 String yuanwen="Hello world"; /** * 确定位移的位数,比如4位 */ int key=3; /** * 加密 */ String encrypt = encrypt(yuanwen, key);
/** * 解密,需要密文和转化的位数key */ String decrypr = decrypr(encrypt, key); System.out.println(decrypr); }
/** * 凯撒解密,英文的字母交换 * @param miwen 密文 * @param key 偏移量 * @return */ private static String decrypr(String miwen,int key){ StringBuffer yuanwen=new StringBuffer(); if (miwen.length()!=0&& key!=0){ char[] chars = miwen.toCharArray(); for (char name :chars){ int move=name; move-=key; char a= (char) move; yuanwen.append(a); }
}else { return "解密失败"; }
return "解密成功"+yuanwen.toString(); }
/**凯撒大帝的加密方法 * 加密方法 * @param yuanwen 原文 * @param key 偏移量 */ private static String encrypt(String yuanwen, int key) { //开始加密 /** * 1.将字符串转化成字节数组,新增一个字符串空的 * 2.将数组遍历 * 3,遍历时候,开始原文的位置移动,偏移量 * 4.回写好原文生成密文 */
StringBuffer miwen=new StringBuffer();//线程安全的字符串 char[] chars = yuanwen.toCharArray(); for (char name: chars){ int moves=name;//原文字符+偏移量 moves+= key; char a= (char) moves; miwen.append(a);
} System.out.println("密文为"+miwen.toString()); return miwen.toString(); }
}
复制代码
其实这个可以可以被破解的,有点穷举的思想,
频率分析法:
统计学中的概率论,然后开始猜测,生成备份文件,然后查看
在不知道秘钥的情况下,也想进行破解密文,
也正是因为有智者,破解了凯撒加密的文章,罗马帝国也逐渐走向衰弱
字节和比特、位
学习计算机的时候,我们通常会知道,计算机是二进制的,只有 0 和 1,但是他可以表示十进制,十六进制更大的数字,它的存储单位就是比特
Byte 和 bit
Byte 是字节:数据存储的基本单位,比如移动硬盘 512GB,
bit: 简单说叫计算机的原始编码结构,0 和 1,
1 个字节=8bit
Bit:位,比特,
一个字节==8bit
package com.atlucas;
import java.io.UnsupportedEncodingException;
/** * byte字节和bit比特区别 * 1.一个汉字对应的是三个字节 ,在UTF-8下, * 2.如果是GBK, 一个汉字是两个字节, * 3.如果是英文,就无所谓编码格式,只占一个字节 */public class ByteTest { public static void main(String[] args) throws UnsupportedEncodingException { String name="a"; byte[] bytes = name.getBytes("GBK"); //将字符串转化成字节数组,可能默认是utf for (byte name2: bytes){ //变成ASCII看一下多少// int ASCIIa=name2; System.out.println(name2);// System.out.println(ASCIIa); String s = Integer.toBinaryString(name2); //二进制的返回值,bit System.out.println("二进制的这个汉子站"+s);
} }}
复制代码
加密算法的分类:
对称加密算法:
①加密速度快,秘钥不能泄露
②密文不可逆,泄密后破译的可能性极大
③一般结合 base64 去使用
④加密后编码表中找不到对应字符,出现乱码
常见的加密算法:
DES:Data encryption Standard 即数据加密标准,是一种使用密钥加密的块算法,
目前是 AES:Advanced Encryption Stasndard,高级加密标准,目前也是比较常见的加密算法,
RSA,MD5 等非对称加密的算法,通过对特定的编码进行改装,然后生成密文;
总结
今天因为业务需求,对于 token 的知识点需求比较多,我也在实际项目中遇到了,所有就开展是对密码,加密算法,以及 token 的类型文章的更新。
我是卢卡,明天要接着更文章了,晚安了
评论