
大家好,我是车辙,我的掘金小册《SkyWalking:应用监控和链路跟踪》已经上线啦,这是我的第一本电子书,欢迎大家订阅。
整整好是9月的最后一天下午,能按耐住冲动的是少之又少,至于原因嘛你懂的。赶高铁的准备赶高铁,没赶高铁的也假装赶高铁。特别是开发同学,脑门上就差贴张纸条:别打扰我。
现在离跑路时间还有1小时,这个时间点被我司同事亲切的称呼为“交流时间”,俗称开会。这时候,钉钉的 ding 消息弹框而出,“有些项目组的数据库密码是明文,被系统检测出来了,国庆前必须修改完成”。

尼玛,还国庆前,直接说今天不就行了,愤怒值 + 1。“系统也真会赶时间,有些领导下班前开会,你倒好,下班前来个安全检查”,愤怒值直接 + 10086。
没办法,改呗。其实心里知道还是自己的问题,就是想当然了,没有做到最好,就和宝莲灯里二郎神教训沉香似的,凡事不能差一点。这要是明文密码泄漏造成严重事故,年终奖泡汤还算是好的,说不定直接喜提 N+1
为了能按时“赶高铁”,凭借着早些年玩QQ炫舞的手速,还是被我找到了解决方案。因为系统使用 Druid作为数据库管理,可以利用 Druid自带的加密工具进行加密。
首先通过它的ConfigTools对你的明文进行操作,生成公钥、私钥以及加密后的密码。
// 需要加密的明文密码
String password = "youPassword";
// 调用 druid 工具类 生成私钥、公钥、密文
ConfigTools.main(new String[]{password});
结果也和我们预期的一致,

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

搞定,启动项目,果不其然的系统报错,纳尼,是我操作的姿势不对?
看了报错结合分析,才发现是我公钥没有贴上去。之前也提到过,公钥主要用来进行密码的解密,你没进行配置,系统就误认为密码就是这样子,当然连接不上数据库。瞧我这脑子,也就只能装钱了。
添加配置后如下所示,:

重新启动,大工搞成。正准备发到测试环境,让测试大哥帮忙回归下,身边的同事来了句:”其他类型的秘钥怎么办“?
完了,项目里还有浙政钉的秘钥,微信的秘钥,理论上这些秘钥也是属于密码,那么这些配置该怎么加密呢,也没有原生的SDK 提供加密呀?于是,偷摸的问了其他组的同事并许以金铲铲让鸡的重利下,才知道他们用了名为Jasypt的组件,之前压根就没听过。好在我技高一筹,靠着疯狂百度,终于解决了这个坑爹的问题。往下看!
Jasypt 可以和 SpringBoot 整合,只需要简单的配置,就能够在项目启动时,把密文解密成明文。做到对用户加密不可见,对系统明文可见。
这里得补充一句,现在不能和 SpringBoot 整合的组件,想推广都好难。
首先是添加 Jasypt 的SpringBoot依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
jasypt的加密步骤依赖于某个Key,叫做盐值。通过它和某些算法对明文密码进行加密,可以得到密文。
有没有工具类可以尝尝鲜呀?我这边按照官网文档写了个工具类,在工具类中添加盐值,然后设置明文密码后调用,可以得到下图所示的密文。

有需要源码的可以在这个地址下免费获取,所有源码我都会整合在这个项目下面,链接
这个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对明文密码加密,项目启动时解密,最后把盐值存放到生产环境服务器中,大大降低了密码被盗的概率。不过如果服务器被攻破了,那就当我没说......
对于代码中的密码安全问题,大家还是要严谨,不要等到发现了才改。第一是麻烦,因为要回归测试,最好在第一次上线时就改掉。第二是在领导眼里印象也不好,可能还会影响绩效。
最后希望大家多多点赞、收藏。就和买纸质书或者收藏电子书一样,点赞、收藏了,也就代表学会了,不要问我怎么了解的这么清楚。
我是车辙,掘金小册《SkyWalking》作者,一名常被HR调侃为XX杨洋的互联网打工人,。
有需要源码的同学可以关注公众号《车辙的编程学习圈》免费领取,之后的所有源码我都会整合在这个项目下面。也可以在此地址下,点击领取下获取。
本文由博客一文多发平台 OpenWrite 发布!
我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25
有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword
首先,关于我们系统的一些信息,它基本上是建筑行业的电子招标解决方案。所以:列表项我们的系统有多家公司每个公司都有多个用户每家公司可以创建多个拍卖然后其他公司可以为可用的拍卖提交他们的出价。一个出价包含数百或数千个单独的项目,我们只需要加密这些记录的“价格”部分。我们面临的问题是,我们的大客户不希望我们知道投标价格,至少在投标过程中是这样,这是完全可以理解的。现在,我们只是通过对称加密对价格进行加密,因此即使价格在数据库中有效加密,他们担心的是我们拥有解密价格的key。因此,我们正在研究某种形式的公钥加密系统。以下是我们对解决方案的初步想法:当一家公司注册时,我们会使用OpenSSL为其
我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,
我有一个允许更新用户记录的表单。它包含:password和:password_confirmation字段,但我不希望在数据库中已存储加密密码时对它们运行验证。View文件中的字段:'ConfirmPassword'%>在互联网上搜索时,我发现了这段代码,我认为它是针对以前版本的Ruby/Rails的。(我会把它放在我的用户模型中。)validates_presence_of:password,:on=>create由于我的用户模型中密码验证的语法不同(如下),我对我需要的语法感到困惑。validates:password,:presence=>true,:confirmation=>
我正在使用devise,当用户更改密码时,网站会将他们注销。我在网上读到,添加sign_in可以解决问题但不起作用,并且当密码更改时用户会注销。这是我的代码if@user.errors[:base].empty?and@user.update_attributes(params[:user])sign_in(current_user,:bypass=>true)flash[:success]="Useraccounthasbeensuccessfullyupdated"redirect_toedit_user_path(params[:site_id],@user)elserender
如果我构建了一个应用程序来访问来自Gmail、Twitter和Facebook的一些数据,并且我希望用户只需输入一次他们的身份验证信息,并且在几天或几周后重置,那会怎样是在Ruby中动态执行此操作的最佳方法吗?我看到很多人只是拥有他们客户/用户凭证的配置文件,如下所示:gmail_account:username:myClientpassword:myClientsPassword这看起来a)非常不安全,b)如果我想为成千上万的用户存储此类信息,它就无法工作。推荐的方法是什么?我希望能够在这些服务之上构建一个界面,因此每次用户进行交易时都必须输入凭据是不可行的。
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭8年前。Improvethisquestion我需要实现具有各种灵活需求的密码安全。这些要求基本上取自Sanspasswordpolicy:Strongpasswordshavethefollowingcharacteristics:Containatleastthreeofthe
我在Rails中有一个具有以下方法的应用程序,该方法可以加密和解密文本并与Java客户端通信。defencrypt(string,key)cipher=OpenSSL::Cipher::AES.new(128,:CBC)cipher.encryptcipher.padding=1cipher.key=hex_to_bin(Digest::SHA1.hexdigest(key)[0..32])cipher_text=cipher.update(string)cipher_textexcenddefhex_to_bin(str)[str].pack"H*"enddefbin_to_hex(
我一直在尝试使用Thor编写一个小型库,以帮助我快速创建新项目和站点。我写了这个小方法:defssh(cmd)Net::SSH.start(server_ip,user,:port=>port)do|session|session.execcmdendend只是协助我在需要时在远程服务器上运行快速命令。问题是当我需要在远程端的sudo下运行命令时,脚本似乎卡在我身上。例如当执行这个...ssh("sudocp#{file_from_path}#{file_to_path}")脚本会提示我输入密码[sudo]passwordforuser:但是在输入之后整个事情就挂起。有人会碰巧知道它为