首页 > 其他分享 >密码加密,天经地义

密码加密,天经地义

时间:2023-01-03 18:45:37浏览次数:64  
标签:加密 天经地义 盐值 明文 密码 密文 Jasypt

img

大家好,我是车辙,我的掘金小册《SkyWalking:应用监控和链路跟踪》已经上线啦,这是我的第一本电子书,欢迎大家订阅。

整整好是9月的最后一天下午,能按耐住冲动的是少之又少,至于原因嘛你懂的。赶高铁的准备赶高铁,没赶高铁的也假装赶高铁。特别是开发同学,脑门上就差贴张纸条:别打扰我。

现在离跑路时间还有1小时,这个时间点被我司同事亲切的称呼为“交流时间”,俗称开会。这时候,钉钉的 ding 消息弹框而出,“有些项目组的数据库密码是明文,被系统检测出来了,国庆前必须修改完成”。

img

尼玛,还国庆前,直接说今天不就行了,愤怒值 + 1。“系统也真会赶时间,有些领导下班前开会,你倒好,下班前来个安全检查”,愤怒值直接 + 10086

没办法,改呗。其实心里知道还是自己的问题,就是想当然了,没有做到最好,就和宝莲灯里二郎神教训沉香似的,凡事不能差一点。这要是明文密码泄漏造成严重事故,年终奖泡汤还算是好的,说不定直接喜提 N+1

img

数据库明文加密

为了能按时“赶高铁”,凭借着早些年玩QQ炫舞的手速,还是被我找到了解决方案。因为系统使用 Druid作为数据库管理,可以利用 Druid自带的加密工具进行加密。

首先通过它的ConfigTools对你的明文进行操作,生成公钥、私钥以及加密后的密码。

// 需要加密的明文密码 
String password = "youPassword"; 
// 调用 druid 工具类 生成私钥、公钥、密文
ConfigTools.main(new String[]{password});

结果也和我们预期的一致,

  1. privateKey:私钥,用于密码的加密;
  2. publicKey:公钥,用于密码的解密;
  3. password:加密之后的密码

img

感觉有戏啊,把刚刚生成的密文填写到配置文件中,也就是替换之前的明文。

img

搞定,启动项目,果不其然的系统报错,纳尼,是我操作的姿势不对?

img

看了报错结合分析,才发现是我公钥没有贴上去。之前也提到过,公钥主要用来进行密码的解密,你没进行配置,系统就误认为密码就是这样子,当然连接不上数据库。瞧我这脑子,也就只能装钱了。

添加配置后如下所示,:

img

重新启动,大工搞成。正准备发到测试环境,让测试大哥帮忙回归下,身边的同事来了句:”其他类型的秘钥怎么办“?

完了,项目里还有浙政钉的秘钥微信的秘钥,理论上这些秘钥也是属于密码,那么这些配置该怎么加密呢,也没有原生的SDK 提供加密呀?于是,偷摸的问了其他组的同事并许以金铲铲让鸡的重利下,才知道他们用了名为Jasypt的组件,之前压根就没听过。好在我技高一筹,靠着疯狂百度,终于解决了这个坑爹的问题。往下看!

img

Jasypt

Jasypt 可以和 SpringBoot 整合,只需要简单的配置,就能够在项目启动时,把密文解密成明文。做到对用户加密不可见,对系统明文可见。

这里得补充一句,现在不能和 SpringBoot 整合的组件,想推广都好难。

添加依赖

首先是添加 JasyptSpringBoot依赖

<dependency>
  <groupId>com.github.ulisesbocchio</groupId>
  <artifactId>jasypt-spring-boot-starter</artifactId>
  <version>3.0.2</version>
</dependency>

明文加密

jasypt的加密步骤依赖于某个Key,叫做盐值。通过它和某些算法对明文密码进行加密,可以得到密文。

有没有工具类可以尝尝鲜呀?我这边按照官网文档写了个工具类,在工具类中添加盐值,然后设置明文密码后调用,可以得到下图所示的密文。

img

有需要源码的可以在这个地址下免费获取,所有源码我都会整合在这个项目下面,链接

这个ENC(Jasypt解密时的标识,至于被圈起来的就是我们的密文了,jasypt会在启动时

根据该标识对数据进行解密,最后存放到内存中。

按照这种方式,我们就可以把所有被Spring管理的明文密码全部替换成密文,然后启动时进行解密。那么系统怎么知道盐值是什么呢?

添加盐值

我们之前只是手动在工具类设置了盐值,如何在系统中设置呢?最简单的方式就是在SpringBoot 配置文件中添加。

jasypt:
  encryptor:
    password: chezhe

如果觉得没问题的同学,建议您和沉香一样回炉重造下。这种方式不就和我们之前犯得错误一样嘛,丢了西瓜捡了芝麻。就如同不经调研,贸然引入技术,最后反而需要对这项技术付出极大的成本。所以有句话我一直奉为经典:用的越多,错的越多

还记的SpringBoot的启动方式吗,我们可以把盐值配置在启动脚本中。

java -jar -Djasypt.encryptor.password=chezhe chezhe.jar

应该都看的懂这什么意思吧。看不懂的同学评论区评论,让各位大佬们帮忙回答下,总不能被白嫖~

支持哪些加密算法

在这个版本中默认的是PBEWITHHMACSHA512ANDAES_256,当然它还支持PBEWithMD5AndDES或者 SM4等加密算法,有兴趣的同学可以去官网看看。官网地址

总结

虽然最后“赶高铁”以失败告终,却学到了不少技能,喜提N+1 失败,也算是值了。通过Jasypt对明文密码加密,项目启动时解密,最后把盐值存放到生产环境服务器中,大大降低了密码被盗的概率。不过如果服务器被攻破了,那就当我没说......

对于代码中的密码安全问题,大家还是要严谨,不要等到发现了才改。第一是麻烦,因为要回归测试,最好在第一次上线时就改掉。第二是在领导眼里印象也不好,可能还会影响绩效。

最后希望大家多多点赞、收藏。就和买纸质书或者收藏电子书一样,点赞、收藏了,也就代表学会了,不要问我怎么了解的这么清楚。

img

我是车辙,掘金小册《SkyWalking》作者,一名常被HR调侃为XX杨洋的互联网打工人,。

有需要源码的同学可以关注公众号《车辙的编程学习圈》免费领取,之后的所有源码我都会整合在这个项目下面。也可以在此地址下,点击领取下获取。
本文由博客一文多发平台 OpenWrite 发布!

标签:加密,天经地义,盐值,明文,密码,密文,Jasypt
From: https://www.cnblogs.com/trotyzyq/p/17023107.html

相关文章

  • mysql8.0的版本忘记密码
    mysql8.0的版本;出现错误:ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:YES);第一步:关闭netstopmysql这个需要cmd的管理员权......
  • 小程序 SHA1加密算法使用
    创建一个js文件,或写入util.js中//SHA1加密functionencodeUTF8(s){vari,r=[],c,x;for(i=0;i<s.length;i++)if((c=s.charCodeAt(i))<0x80)r.pu......
  • unity绕过易赛通加密处理
    代码在这里参考这里的文章:https://www.grablan.com/news/2017/20110.html抽取一下重点:易赛通使用驱动对关键API进行Hook的方式实现了文件的加解密功能,加解密过程对应......
  • 绿盾加密导致vs升级或修改设置后无法启动
     删除%LocalAppData%\Microsoft\VisualStudio\16.0_cd0f2560\privateregistry.bin,再次启动VS。   无法初始化注册表根配置单元-VisualStudio反馈......
  • ubuntu设置root密码
    新创建虚拟机root用户需要设置密码普通用户登录后在终端打开sudopasswdroot输入密码,并回车(可能提醒无效的密码,密码位数,密码格式不对等提示信息,可以忽略。继续操作仍......
  • Oracle设置密码永不过期
    【Oracle密码过期解决办法】1.在CMD下以sqlplus/assysdba登陆数据库2.设置密码永不过期运行语句ALTERPROFILEDEFAULTLIMITPASSWORD_LIFE_TIMEUNLIMITED;3......
  • 用户及密码设置
    系统用户配置文件(/etc/passwd)[root@localhost~]#vi/etc/passwd#文件内容root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/......
  • linux 找回root密码方法(CentOs 7.6)
    1:首先,启动系统,进入开机界面,在界面中按e进入编辑界面。如下图:2:进入编辑界面,使用键盘上的上下间吧光标往下移动,找到以"linux16"开头内容所在的行数,在行的最后面输......
  • 阴阳,密码管理
     2.1.1、扫描二维码诈骗不法分子将二维码植入病毒程序,再以返利或者降价或送礼品为饵,发送二维码。一旦轻易扫描安装,木马就会盗取应用账号、密码等个人隐私信息,再以短信验证......
  • 改进设置密码
    #include<stdio.h>intmain(){inti=0;intch=0;charpassword[20]={0};printf("请输入密码:");scanf("%s",password);while((ch=getchar())!='\n'......