为什么要加密?
(资料图)
当然是为了保密。
最早的密码应用,都伴随着阴谋与战争。
中国古代的“阴符”、“阴书”就是其中的代表。
到了近代,二战最著名的一个故事,就是纳粹德国的Enigma密码机
以及图灵和他发明的密码破解机。
可以说,现代战争中,信息安全极其重要
如果你的部署、命令都被对手知道
你收到的指令都是对手伪造的
这还怎么打?
在当下,加密数据和密码的应用,
从军事,到商业领域,以及科学界
乃至每个人普通的生活
如果没有数据加密,每个人的信息都是透明的
想想可怕的电话诈骗,你还觉得自己的信息安全吗?
有一句话说的是:
大数据时代,没有秘密
加密方式
最常见的计算机加密方式有三种:
对称、非对称、摘要
对称的意思是:
我有一个秘钥K,能把原文 A 加密成 A1,还能把 A1 还原成 Af(A, K) =A1f(A1, K) =A
对称加密用途最为广泛,
操作简单,速度快,
适合场合多样
但缺点很明显,秘钥K太关键了
如果你需要让密文被其他授信的人访问
必须给他发秘钥
但问题是,
只要得到秘钥,就能破解一切,包括非法用户
非对称安全性稍微高一点
有2个秘钥,一般是成对的公钥和私钥
通常是用公钥加密,私钥解密
这种情况下,解决了对称加密的发送秘钥问题
现在公钥是公开的,私钥只有我自己有
永远不发送,就不会泄密
摘要加密一般采用的是hash算法,
只加密不解密,
适合于只验证对不对,而不验证是什么。
举个朴素例子:
二中的学生,学号格式是 L220130103 格式
三中的学生,学号格式是 PLE821 格式
现在我要验证这个人是哪个学校的,
其实无需关注具体内容,
简单判断一下长度就可以了
当然真正的算法没这么简单
下面具体来谈
便于大家统一理解
我们建一个项目
统一使用hutool工具包
cn.hutool hutool-all 5.8.5
对称加密
最简单的是des方法
他使用一个简单的秘钥,就可以实现加密和解密
我们写一个junit的test,或者写一个main也可以
class Test1 {@Testvoid test() {String text0 = "这是原文";String key = "xiaomian";DES des = new DES(key.getBytes());String text1=des.encryptBase64(text0);System.out.println(text1);}}
运行结果是 +iJWs7q8+dyiRBouA8lDBA==
我们使用秘钥 “xiaomian”,
把“这是原文”,加密成了一个看不懂的字符串
然后开始解密
class Test1 {@Testvoid test() {String key = "xiaomian";DES des = new DES(key.getBytes());String text2=des.decryptStr("+iJWs7q8+dyiRBouA8lDBA==");System.out.println(text2);}}
运行结果是 这是原文
还是同一个key,
用相反的方法,把原文解出来了
操作非常简单。
des就是一个最简单的对称加解密方法
类似的还有aes算法
可以使用hutool工具包,
操作差不多
非对称加密
使用非对称的主要原因
就是 安全、安全、还是安全
非对称在性能方面和对称没的比
因此,建议非对称使用短数据场合
而长数据使用对称实现。
最常用的是RSA算法
首先要生成一对秘钥,这个就没法人工创造了
我们可以借助工具
class Test2 {@Testvoid test() { KeyPair pair = SecureUtil.generateKeyPair("RSA"); String privateKey = Base64.encode(pair.getPrivate().getEncoded()); System.out.println("privateKey:" + privateKey); String publicKey = Base64.encode(pair.getPublic().getEncoded()); System.out.println("publicKey:" + publicKey);}}
输出结果为:
privateKey:MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALBgrUOQySQB72VrGyijYZcaNM26t49oaKlNddu4SLpEdJzpUnVjXtIi9Nj/DkFBXgSB9FYdrv7MpQWzTmLw0do6pcfo2cekmBGPnFRdChtEf8Npq0pAV2LlNahwkB8fxZcbQYaaWBuBkx7aHT09JGsEpi9P3y7ae4vwYmFlWgEHAgMBAAECgYBVBnXgEWb1Zb1rLaPNBl3gQrDb0Dv29QUnQIElZ4QfzypMDipDDqFCObnA9cuAZ6uUDrWj4fFfQXX39oU+KwtuESddT9rJw1hPSy2i5ityEyYO5OZQRJaTVWPWzpph+bqFLkngaOvlr3OBG7YtywUL0P8toz2pOQKpoQOkffetuQJBAP26GKiOcs/sKhrzuM/t0S2ERXXDcu07jWxJ8gioQBuQaM7AA14tbiRzaZm3Xt+cGPjHJUGEJpDvGLQ9MavEZDMCQQCx9S+JevTGpxHMX/R3uUawlTsks1keyd0rqBtqQQx7V9Bm8htrlVU3QbhacFd/FJodWX7mGOAO6nLVGK/5qXvdAkB13zSBadvwuDg/WSZsgoEA8kgKk4gaqeXjft7QIsnVhFsMYauu3tAiYvOWE9ghbbU0LeAi9a+s+UayxRMERzJ9AkA5Y7fL32I2+kQMI9nEDnUUl1u2bzxLaJAx9wm4T3gGAwDLYkKjhEoyArjAOcCN1AgLdQQuklEXnlYgENEXc6flAkEAwDbTBfOtuP/6S5nU0gX9D5fYlF/fz4YTfBjHC2dZ/wrmWlJA0f7QFf5DysQB9AXJX6ZWL/3LkMtHPafqBMKpJw==publicKey:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwYK1DkMkkAe9laxsoo2GXGjTNurePaGipTXXbuEi6RHSc6VJ1Y17SIvTY/w5BQV4EgfRWHa7+zKUFs05i8NHaOqXH6NnHpJgRj5xUXQobRH/DaatKQFdi5TWocJAfH8WXG0GGmlgbgZMe2h09PSRrBKYvT98u2nuL8GJhZVoBBwIDAQAB
看吧,鬼也看不懂
不过能用就行
接下来,开始使用秘钥对,进行加密和解密
class Test2 {static String privateKey;static String publicKey;@BeforeAllstatic void createKey() { KeyPair pair = SecureUtil.generateKeyPair("RSA"); privateKey = Base64.encode(pair.getPrivate().getEncoded()); System.out.println("privateKey:" + privateKey); publicKey = Base64.encode(pair.getPublic().getEncoded()); System.out.println("publicKey:" + publicKey);}@Testvoid test() {String text = "这是原文";RSA rsa = new RSA(AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue(), privateKey, publicKey); String text1 = rsa.encryptBase64(text, KeyType.PublicKey); System.out.println("公钥加密: " + text1); String text2 = rsa.decryptStr(text1, KeyType.PrivateKey); System.out.println("私钥解密: " + text2);}}
输出结果为:
公钥加密: KSifTf6tS6LGlBT9LJC33VXzkXtaQEIGJcpf1BU2ptzRXTtBzvjx83EffCqntD7/M7ZciTr4MIBFBPFCxLs9NVEeC4K9/B8fQE/3hdsMzWBTnKQzQR2vd1i5mOgFaHYwTLwrq9Dbkv1YGluCb004YtLEqdjSO/Oljs7x2YVtvGc=私钥解密: 这是原文
也可以反过来用
@Testvoid test() {String text = "这是原文";RSA rsa = new RSA(AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue(), privateKey, publicKey); String text1 = rsa.encryptBase64(text, KeyType.PrivateKey); System.out.println("私钥加密: " + text1); String text2 = rsa.decryptStr(text1, KeyType.PublicKey); System.out.println("公钥解密: " + text2);}
私钥加密: Ty5YGXHUajKHtlmQ7yGYJtc39Rjb3IvSIm7WWg4+Ge6u8MDeJ3TLYZokgBbAMZRcZBZ8bIWiou12+KxoW8moRwke4PlWVipgwhC2l6qo7WtTMiwnGh+0+B8wnY3OySFK4ZeOMQFgYuiTL2uZqofLXyNzwID7GKCfWI6EL29wtbE=公钥解密: 这是原文
对称算法的特点就是
随便先用谁,然后用另一个解
一般来说,有意义的信息,加密传递
建议使用 公钥加密,私钥解密
这种方法,确保信息只能由你指定的对象收到
另一种反过来的做法,
私钥加密,公钥解密
用于数字签名场合
证明这个签名是某人做的
因为只有他有他自己的私钥
摘要加密
摘要加密是单向的
能加不能解
主要目的是生成特征码
常用算法包括 md5,sha 等等
class Test3 {@Testvoid test() {String text = "这是原文";String text1 = DigestUtil.md5Hex(text); System.out.println(text1);}}
输出结果是:
531ffeed49bb13a6cf93049cc1e5ee53
比如系统密码,一般采用摘要加密
假设我的密码是 123456,
md5之后变成了 e10adc3949ba59abbe56e057f20f883e
如果有人能看到数据库表,
哪怕他找到了我的密码 e10adc3949ba59abbe56e057f20f883e,
也不知道我实际的密码是123456
当登陆时,会对用户输入的密码再次md5,
如果结果还等于e10adc3949ba59abbe56e057f20f883e,
就表示输对了密码。
摘要加密的特点是
输出结果位数是固定的
比如上面列出的md5,加密后永远是固定长度
他的特点主要是:
输入不同,加密结果就不同输入相同,加密结果一定相同
现在一般md5用的也少,主要是长度和复杂度
一般使用 sha256 或 sha512
他可以做简化验证
比如,我有一个文档,大小为 100M
如何验证他的内容发生串改
我们不可能拿2个100M的文件,逐个字节比较
这时,只要对2者分别做摘要运算,
得到一个短的字符串,对他们比较就可以了
这种验证的特点是:我知道你对和不对,但我不知道哪错了
总结
三种方法中,一般使用原则是
速度快,用对称安全高/数据少,用非对称用于验证对错,保留特征码,用摘要大家可以试试,顺便安利一下hutool,
非常优秀的工具包
之后我们会专文介绍国密算法
-
5分钟讲清楚常用加密算法md5之后变成了e10adc3949ba59abbe56e057f20f883e
-
焦点热讯:唐人神:今年1-2月饲料销量同比有小幅增长唐人神近日在电话会议中表示,今年1-2月饲料销量同比有小幅增长。此外,公司表示,子公司龙华农牧大部分生猪养殖产能为楼房养猪。公司本部广东
-
早安北京0325:最低温-1℃;国家植物园首届桃花观赏季开幕早安北京0325:最低温-1℃;国家植物园首届桃花观赏季开幕
-
格式刷的快捷键 电脑格式刷快捷键在哪里|天天速看格式刷的快捷键就是先按住Ctrl+Shift+C按键,再按下Ctrl+Shift+V按键就可以了,具体步骤如下:1 选中起始文字进入word软件界面,在这个界面
-
联合体投标的标书怎么做_联合体投标时 怎么做标书_天天微头条1、联合体投标协议书是联合体投标书的前提,也是确定联合体内各单位合作关系,责任分工的重要前提。2、协议书的范本如下:2、
-
《西游记》读后感300字_《西游记》读后感300字3篇|动态焦点欢迎观看本篇文章,小勉来为大家解答以上问题。《西游记》读后感300字,《西游记》读后感300字3篇很多人还不知道,现在让
-
国际油价稳定在40美元附近 油价或将迎来年内首次上涨石油市场经历了一段坎坷的时期。首先,疫情的爆发削弱了石油需求,粉碎了沙特和俄罗斯之间的联盟。接下来,疫情在全球范围蔓延,沙特和俄罗斯
-
全球今亮点!半场-孙兴慜左右开弓半场梅开二度 韩国暂2-0哥伦比亚北京时间3月24日19:00,友谊赛韩国对阵哥伦比亚。上半场,哥伦比亚后场失误,孙兴慜兜射空门首开纪录;补时最后时刻,孙兴慜任意球破门完成梅
-
iis安装教程 今日要闻1、打开系统控制面板,找到程序与功能,然后打开程序和功能的页面。点击左边的启用或关闭windows功能。2、在windows功能里面我们能够看到 netfra
-
【全球独家】奥运天使为家乡代言!惠南古城桃花节“上新”“不到桃花村,哪知桃花艳”。阳春三月,南汇桃花村的460亩桃园灿若云霞,笑迎八方来客。3月24日下午,2023上海桃花节浦东新区惠南镇会场在...
-
今日热文:奥来德:全资子公司拟签署1.29亿元日常经营重大合同3月24日电,奥来德公告,全资子公司上海升翕光电科技有限公司向厦门天马显示科技有限公司提供28套线蒸发源设备,合同金额1
-
业绩好、超额稳定、规模适中,这样的经理还有没有?业绩好、超额稳定、规模适中,这样的经理还有没有?,华富,陈启明,基金资产净值
-
【天天报资讯】春天是孩子猛长个的季节,常吃5道家常菜,补充营养,助力长高个导语:春天是孩子猛长个的季节,常吃5道家常菜,补充营养,助力长高个家里有了孩子后,家长们都特别关注孩子的发育,希望他长得高又聪明,相信
-
头条:国产商务车7座最新款图片(长安CS95PLUS正式上市17.59万起)如今,二孩三孩家庭越来越多,幸福指数升级的同时,人们对于7座SUV的关注度不断升级,毕竟,多家庭成员出行,7座大车舒服又方便。各大汽车品牌
-
【环球时快讯】英明老人疗养院_关于英明老人疗养院的简介1、广州市芳村英明老人疗养院自1998年建院已九周年。为广州市社会福利协会单位会员。本文关于英明老人疗养院的简介就讲
-
如何方便地记录每天体重记录体重的方式又很多种,1、写在本子上;2、写在手机的记事本里;3、用APP记录;4、用电脑记录;可以,记录体重的本子总是丢,怎么办?写手机
-
陆军组织2023年开训动员 当前观点今天(1月3日)上午,京郊某地,陆军组织2023年开训动员。官兵身着21式作训服,佩戴新式战斗装具,按照合成作战时的模块
-
“超级真菌”要来了?已遍布美国一半以上的州据央视新闻客户端报道,当地时间3月20日,美国疾病控制和预防中心表示,耳念珠菌正在以“惊人的速度”传播,目前已遍布美国一半以上的州,...
-
渝乡辣婆婆品牌介绍_渝乡辣婆婆餐饮连锁 动态成立于2001年,以餐饮服务为主导产业的全国连锁餐饮企业,专注于“一菜一式,百菜百家”的经典川菜重庆麻辣婆婆成立于200
-
全球观察:2023年4月新番《邻人似银河》第三弹PV及主视觉图公开是改编自雨隠ギド作画的同名漫画作品,TV动画《邻人似银河》第三弹PV及主视觉图公开,将于2023年4月9日开播。为了养育年幼的弟弟妹妹,卖力的
-
篝火舞蹈_篝组词|即时1、篝火蟹篝篝灯鱼帛狐篝狐鸣篝火麝篝篝火狐鸣熏篝香篝秦篝狐鸣篝中篝石篝车篝灯呵冻篝炉衣篝篝篓银篝。本文到此分享完毕
-
乡村爱情1演员表 天天信息1、《乡村爱情》第一部演员表:赵本山饰王大拿,范伟饰王木生,王亚彬饰王小蒙,于月仙饰谢大脚,唐鉴军饰谢广坤,贺树峰饰谢永强,王小宝饰王
-
让孩子在自然光下学习—南卡护眼台灯L1 Pro|快资讯hi~屏幕前的小伙伴们你们好呀,我是你们的数码小江仔,相信已经为人父母的都有这样的感觉:随着孩子越来越大,学校里布置的作业也渐渐多了起
-
美好医疗最新公告:惠州美好首次通过高新技术企业认定 世界新消息美好医疗最新公告:惠州美好首次通过高新技术企业认定
-
晋江兔区是哪个板块_晋江兔区1、首先去appstore下载晋江小说阅读app。2、下载后直接点击桌面。3、然后进入主页,点击“论坛”。4、然后点击
-
广西壮族自治区南宁市发布冰雹橙色预警广西壮族自治区南宁市发布冰雹橙色预警
-
关于父母的爱的作文600字以上_关于父母的爱的作文600字1、父母对儿女的爱是世界上最伟大、最无私的爱。2、我的父母同所有的父母一样,他们的爱伴随着我成长。3、在摔倒的时候,他们
-
百度回应“文心一言文生图功能”百度23日在其官方微博表示,注意到对文心一言文生图功能的相关反馈。回应说明如下:1、文心一言完全是百度自研的大语言模型,文生图能力来自文
-
普通国税发票如何辨别真伪增值税专用发票一般在抵扣认证时,扫描通过的发票即为真发票。普通发票及增值税普通发票则可通过以下方式辨别真伪:1.外貌鉴别:分别查看发票
-
【天天快播报】中国驻日使馆确认2名中国公民在日本遭5人假扮燃气工入室抢劫当地时间3月21日上午,日本东京发生一起入室抢劫案,日媒称有5人假扮燃气公司工作人员闯进公寓后将一男一女捆住,并抢走10