推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

应用侧配置文件中的数据库密码、*redis密码

   2023-06-15 网络整理佚名2850
核心提示:应用密码包含:数据库密码、redis密码、通讯密码、pin密钥等。由于pin密钥之类的是通过硬件加密机实现的,不在本文论述范围内,本文重点关注应用侧配置文件中的数据库密码、**redis密码、FTP/FTPS**密码等。特别注意1:加密后的可执行文件不再可以通过shell脚本的指令被引入,所以涉及到多个脚本调用的,需要把密码整合到主脚本,然后将主脚本加密,被加密的脚本中是可以包含指令的。

1.应用密码安全定义

应用密码包括:数据库密码、redis密码、通信密码、pin key等。

本文的目标是保证上述密码在应用中不是明文形式,而是加密形式,加密机制要相对安全,不易破解。

2. 本文范围

因为pin key之类的是硬件加密机实现的,不在本文讨论范围之内。 本文重点介绍应用端配置文件中的数据库密码、**redis密码、FTP/FTPS**密码等。

三、现状说明

1、很多系统对密码安全不够重视,密码仍以明文形式为主。

例如:(以下图片为测试环境模拟示例)

数据库密码在配置文件中是明文写的:

redis密码在配置文件中是明文写的:

2、即使使用加密,也大多使用比较容易破解的算法,比如。

3、FTP/FTPS密码以明文形式写在shell脚本中。

4、保护应用密码的意义

即使服务器被黑,经过加密的密码也可以防止黑客直接拖拽数据库获取业务数据,或者侵入关联系统,造成更大的危害。 并且可以为我们的防守争取时间。

5.使用框架保护配置文件中的密码 5.1 组件介绍

[地址]

特别说明1:本次提供的tool-1.1.1.jar包提供| SM4 | | 一共有4种加密算法,前两种是基于国密的SM3/SM4算法,两种加了HMAC的算法加了随机盐,每一种加密密文之间的关系是不一样的。

特别说明2:本教程基于/(类似于普通java应用),推荐使用IDEA-IDE和Maven工具。

5.2 快速入门

step1:在jdk环境中添加依赖

# 拷贝依赖包bcprov-jdk15to18-1.66.jar(Maven仓库可下载,附件有提供)到jdk环境目录下
[Mac-jdk路径]
/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/jre/lib/ext/
[Linux-jdk路径]
/usr/java/jdk1.8.0_231-amd64/jre/lib/ext/
[windows-jdk路径]
C:\Program Files\Java\jre1.8.0_261\lib\ext\

step2:应用引入依赖(pom.xml设置)

将打包好的-1.1.1.jar复制到{}/src/main//lib/。

修改pom.xml文件

<dependency>
<groupId>com.github.ulisesbocchiogroupId>
<artifactId>jasypt-spring-boot-starterartifactId>
<version>3.0.3version>
dependency>

<dependency>
<groupId>passwdtoolsgroupId>
<artifactId>passwdtoolsartifactId>
<version>1.1.1version>
<scope>systemscope>
<systemPath>${project.basedir}/src/main/resources/lib/passwdtools-1.1.1.jarsystemPath>
dependency>

在IDEA中点击File--,点击+,添加上一步lib目录下的jar包。

特别提示:建议使用最新的3.0.3版本。 3.0.0之前版本默认加密方式为 ,算法安全性不够。

修改pom.xml,设置maven打包规则,一起打入自定义jar包:

step3:计算密文

可以直接使用我打包好的jar包来计算密文,如下:

java -jar passwdtools-1.1.1.jar {Algorithm} "{加密密码}" "{明文}"
[Algorithm]
1-PBEWithHMACSM3AndSM4(推荐)
2-SM4
3-PBEWithHMACSHA512AndAES_256
4-PBEWithMD5AndDES
eg:
java -jar passwdtools-1.1.1.jar 1 "dabaicai" "1qaz2wsx@dbc"

step4:添加自定义解密类r(会在附带的zip包中提供)

import com.dbc.passwdtools.PBEWithHMACSM3AndSM4StringEncryptor;
import org.jasypt.encryption.StringEncryptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration("CustomStringEncryptor")
public class CustomStringEncryptor implements StringEncryptor {
private static final Logger logger = LoggerFactory.getLogger(CustomStringEncryptor.class);
@Value("${jasypt.encryptor.password}")
private String enpassword;
@Override
public String encrypt(String s) {
return null;
}
@Override
public String decrypt(String s) {
PBEWithHMACSM3AndSM4StringEncryptor pbeWithHMACSM3AndSM4StringEncryptor = new PBEWithHMACSM3AndSM4StringEncryptor();
pbeWithHMACSM3AndSM4StringEncryptor.initialize(this.enpassword);
return pbeWithHMACSM3AndSM4StringEncryptor.decrypt(s);
}
}

注意:如果要使用其他算法,只需修改蓝色部分的字体即可。 -1.1.1.jar还封装了SM4等其他工具类。

step5:在配置文件中配置密文

# 数据库密码(密文处填入step2计算得出的密码)
spring.core.password=ENC({密文})
# 设置使用自定义解密Bean
jasypt:
encryptor:
bean: CustomStringEncryptor
# 设置加密密钥(这里是临时配置但并不安全,正确配置请参考5.4进阶配置)
jasypt.encryptor.password=dabaicai

例如:

5.3 加密密码配置问题

这个框架已经被广泛使用,但是加密密钥的配置使用存在普遍的安全问题。

在配置文件中配置

通过查看你的pom.xml文件或者导入的jar包很容易推断出应用使用的版本,从而推断出算法,然后根据密码使用工具解密明文。 解密代码如下(如果使用):

AES256TextEncryptor aes256TextEncryptor = new AES256TextEncryptor();
aes256TextEncryptor.setPassword("dabaicai");
String enc_password = "Xe1mGmfgEcIlU/zWfqrx2T+q+t5+O7qvvM+JDNnhkgZlrny6pjVHV+U/wfVp8jA+";
String password = aes256TextEncryptor.decrypt(enc_password);
System.out.println("de password: " + password);

配置等待配置中心

配置中心在应用本地有一个缓存文件,配置的密码也可以通过缓存文件查看。

从命令参数开始

java -jar -Djasypt.encryptor.password=dabaicai {xxx.jar}

无法隐藏进程信息:

5.4 高级配置

综上所述,隐藏加密密码配置项还需要其他方法。。。目前推荐的方法是在应用启动脚本中读取用户输入的加密密码保存到临时文件中,然后读取内容设置应用程序启动时的临时文件,最后删除启动脚本文件中的临时密码。 这样,加密后的密码只保存在内存中,很难直接读取。

相关启动脚本参考代码如下:

#!/bin/bash
echo "please input the encryption password: "
read encryption
echo "${encryption}" > /tmp/startEnv.properties
# start the application
nohup java -jar mintleaf-fast.jar >/dev/null 2>&1 &
sleep 10
rm -rf /tmp/startEnv.properties

应用启动时的代码(这里以/为例):

private static final String START_ENV_PROFILE_PATH = "/tmp/startEnv.properties";
private static final String JASYPT_ENCRYPTOR_PASSWORD = "jasypt.encryptor.password";
public static void main(String[] args) throws Exception {
SpringApplication app = new SpringApplication(MintLeafApplication.class);
// 读取临时文件
Map<String, Object> map = new HashMap<>();
String jasEncPassword = FileUtil.readLine(new RandomAccessFile(new File(START_ENV_PROFILE_PATH), "r"), Charset.defaultCharset());
map.put(JASYPT_ENCRYPTOR_PASSWORD, jasEncPassword);
app.setDefaultProperties(map);
app.run(args);
//SpringApplication.run(MintLeafApplication.class, args);
}

参考执行结果:

view 和 ps -ef 都没有泄漏:

5.5 使用总结

jdk环境添加依赖包-将maven/jar包依赖引入应用-计算密文-添加自定义解密类r-配置ENC({})和自定义解密Bean-在应用启动脚本中读取用户输入的密码并write it to a file -- 应用程序启动时读取特定的临时文件设置.. -- 启动脚本删除临时文件。

尽量使用最新版本的框架。 本次提供的tool-1.1.1.jar包提供| SM4 | | 一共有4种加密算法,前两种是基于国密SM3/SM4算法,这两种算法与HMAC加入了随机盐的关系。 加密后的密文不同,建议使用算法。

该框架还支持在和其他分布式配置中心配置密码。

其他框架的详细使用方法请参考页面.md文档中的相关说明。

六、使用Shc加密Shell脚本 6.1 Shc简介

SHC是一个脚本编译程序,用RC-4加密代码对shell进行加密,将shell转换为二进制可执行文件(支持动态链接和静态链接)。

下载地址:~//

6.2 安装

在linux下使用如下方法安装:

# 下载对应版本
wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9b.tgz
# 解压
tar vxf shc-3.8.9b.tgz
# make安装(可能会出现一些编译错误,请忽略)
cd shc-3.8.9b
make test
make strings
make install
# 如果出现如下编译错误请忽略(只是会缺少一些帮助文档)

apt-get install shc

6.3 快速启动

:

CFLAGS=-static shc -v -f {shell脚本}

参数说明:

-e date (指定过期时间)
-m message (指定过期提示的信息)
-f script_name (指定要编译的shell路径)
-r relax security (在其他服务器执行/在不同操作系统执行,但是安全性会降低)
-v Verbose compilation (输出编译的详细情况)
CFLAGS=-static (采用静态编译,关联的静态库会被引入到可执行文件中,否则最终执行服务器上也需要安装对应的静态库)

测试示例:

下面是一个典型的FTP访问脚本.sh:

#!/bin/bash
ftp_username=nfsnobody
ftp_password=1qaz2wsx@dbc
function ftp_upload() {
lftp -u ${ftp_username},${ftp_password} sftp://10.211.55.5:20002 << EOF
cd reportcase
put $1
bye
EOF
}
ftp_upload $1

使用 shc 加密:

CFLAGS=-static shc -v -f ftp_test.sh

加密后会生成可执行二进制文件.sh.x和.sh.xc。

后者是生成可执行程序.sh.x的原始C语言文件。 这个原文件包含很多可以用来识别的信息,建议删除,以免被识别:

还建议将加密的可执行文件 .sh.x 重命名为其他名称。 比如.sh.x的后缀太明显了,用shc加密是不行的。 另外,可以看到上面的内容已经被编译成一个无法识别的可执行文件了:

执行加密程序后,可以正常上传:

6.4 使用总结

在部署服务器上安装 shc 工具。

使用 =- shc -v -f {shell} 来加密你的脚本。

删除生成的.c 文件并重命名.sh.x 文件。

特别说明1:加密后的可执行文件不能再通过shell脚本指令导入,所以如果涉及多个脚本调用,需要将密码集成到主脚本中,然后对主脚本进行加密。 加密的脚本可以包含指令。

特别说明2:研发环境脚本加密后如果想部署到生产环境(跨服务器),加密时需要加上-r参数:=- shc -r -v -f {shell

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON