密码学:
大家晚上好,我是卢卡,这期主要是来了解一下密码学的知识,其实这期呢也是给大家长见识的篇目,为了更好的了解密码的面目,我们每天都在进行登录操作,比如抖音、微博以及很多的软件,第一次登录软件,都会要求登录账号,其实登录操作–就是为了捕捉用户,固定用户信息,从而进行权限控制。每个软件都会有相应的功能特点,比如抖音做短视频,用户通过发送短视频,别的用户通过查看,比如评论权限,这都是通过用户账号,然后获取的同步信息, 以及我们每次鉴权登录的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的类型文章的更新。
我是卢卡,明天要接着更文章了,晚安了
原文始发于微信公众号(卢卡多多):你真的会设置密码吗?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/23481.html