如何在你的应用中使用Jasypt来保护你的数据库用户名和密码

“任何时候都不应该明文显示和存储密码”,我想这个原则是一个稍微有点安全常识的人都懂的,那么在Java应用中,如何最简单最方便地保护你的应用的数据呢?

本文我们以数据库的用户名和密码为例子,来讲解在APDPlat中我们如何使用开源项目Jasypt来实现加解密。

首先,我们引入依赖库,使用Maven方式如下:

<dependency>
    <groupId>org.jasypt</groupId>
    <artifactId>jasypt</artifactId>
    <version>1.5</version>
</dependency>

其次,接下来我们看看如何加密:

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;

/**
 *把密文放到配置文件中的时候要注意:
 * ENC(密文)
 * @author 杨尚川
 */
public class ConfigEncryptUtils {
    public static void main(String[] args){
        //加密工具
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        //加密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm("PBEWithMD5AndDES");
        //自己在用的时候更改此密码
        config.setPassword("apdplat");
        //应用配置
        encryptor.setConfig(config);
        String plaintext="root";
        //加密
        String ciphertext=encryptor.encrypt(plaintext);
        System.out.println(plaintext + " : " + ciphertext);
    }
}

运行输出结果如下:

root : azL9Cyp9H62r3eUgZ+TESw==

再次,接下来我们看看如何解密:

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;

/**
 *把密文放到配置文件中的时候要注意:
 * ENC(密文)
 * @author 杨尚川
 */
public class ConfigEncryptUtils {
    public static void main(String[] args){
        //加密工具
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        //加密配置
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setAlgorithm("PBEWithMD5AndDES");
        //自己在用的时候更改此密码
        config.setPassword("apdplat");
        //应用配置
        encryptor.setConfig(config);
        String ciphertext="azL9Cyp9H62r3eUgZ+TESw==";
        //解密
        String plaintext=encryptor.decrypt(ciphertext);
        System.out.println(ciphertext + " : " + plaintext);
    }
}

运行输出结果如下:

azL9Cyp9H62r3eUgZ+TESw== : root

从上面我们可以看到,加密和解密的代码的唯一差别是encrypt和decrypt。

最后我们来看看如何和spring集成,在spring配置文件中加入如下配置,这样当spring读取到的值是加过密的值就会自动解密,那么spring是如何判断一个值是否加密过了呢?是根据特定的前缀ENC(和后缀)来判断的。

<!-- Spring属性文件解密组件  -->
<bean id="propertyConfigurer" class="org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer">
    <constructor-arg ref="configurationEncryptor" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <value>classpath:/org/apdplat/config.properties</value>
            <value>classpath:config.local.properties</value>
            <value>classpath:/org/apdplat/db.properties</value>
            <value>classpath:db.local.properties</value>
        </list>
    </property>
</bean>

<bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
    <property name="config" ref="environmentVariablesConfiguration" />
</bean>

<bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
    <property name="algorithm" value="PBEWithMD5AndDES" />
    <property name="password" value="apdplat" />
</bean>

配置好spring后,我们就可以在指定的配置文件classpath:config.local.properties中使用加密过后的数据库连接使用的用户名和密码了,别忘了特定的前缀ENC(和后缀)哦:

#数据库配置文件

#mysql
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/${module.short.name}?useUnicode=true&characterEncoding=UTF-8&createDatabaseIfNotExist=true&autoReconnect=true
db.username=ENC(qPWWR8YEmQE63EYywEBKaQ==)
db.password=ENC(qPWWR8YEmQE63EYywEBKaQ==)
jpa.database=MYSQL
db.backup.command=mysqldump  -u${db.username} -p${db.password} ${module.short.name}
db.restore.command=mysql -u${db.username} -p${db.password} ${module.short.name}
时间: 2024-12-25 21:58:49

如何在你的应用中使用Jasypt来保护你的数据库用户名和密码的相关文章

您在wp-config.php文件中提供的数据库用户名和密码可能不正确 的解决办法

您在wp-config.php文件中提供的数据库用户名和密码可能不正确 的解决办法 (2015-09-18 23:01:40) 标签: it 技术 经验 wordpress 网站 访问wp-admin/install.php出错:数据库连接错误.您在wp-config.php文件中提供的数据库用户名和密码可能不正确 然后看了下百度,都说是数据库没有连接成功造成的. 那么怎么设置?我整了几次没搞成功,最后还是给解决了.下面我把我设置成功的过程记录下来,以后能用到,也能帮到大家. 1.在htdocs

ubuntu中查看已有的mysql用户并修改用户名和密码

你先进入/etc/mysql 然后该目录下会有一个debian.cnf文件,用sudo cat debian.cnf查看里面的内容. 如果用户名为 debian-sys-maint 使用 mysql -u debian-sys-maint -p 命令并输入上面debian.cnf文件中的密码,然后便登陆mysql了 mysql> use mysql; Database changed mysql> update user set password=password('new password'

svn 中的url路径修改和 清除 svn用户名和密码

TortoiseSVN客户端: 在工作复本的根目录上右键->TortoiseSVN->重新定位(Relocate),输入修改后的URL地址. linux平台:svn sw --relocate svn://old_ip/目录 svn://new_ip/目录 清除svn用户名和密码,如下图说明:

git bash中避免在push时反复输入用户名和密码

我用的是windows系统,这几天学着使用git时发现每次使用git push时每次都要输入一遍用户名和密码,感觉特烦,特意上网查了下,找到了简化方法.虽然不是原创,但至少算是加了点自己的心得和经验吧,毕竟中间也硌了半天. 首先进入你用户名目录,windows一般是在C:\users\Administrator,此时需要新建一个名为.git-credentials的文件,windows本身不允许直接创建以"."开头的文件/文件夹,需要借助于其他工具,由于后面还是要用git来配置信息,这

定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据?

原文:http://www.iteye.com/problems/77856 定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据? 表结构肯定是不能破坏,但是临时表如果是自己的数据库还行,问题是这个Oracle数据库是客户的数据库呢,你不能在他的数据库做任何多余的操作吧?还有别的更好的方法吗? 这个真的是比较困难. 首先,你要从客户机oracle取数据,因为这1分钟间隔之内不知道用户机新增加了哪些数据(大部分情况下是用户使用别的系统插入数据,而你又没有这个系统的程序接口

使用Android中API建议的方式实现SQLite数据库的增、删、改、查的操作

package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.examp

NSPredicate用法总结(Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取)

简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 定义(最常用到的方法): [objc] view plaincopy NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...]; Format:(1)比较运算符>,<,==,>=,<=,!=可用于数值及字符串例:@"number > 100" (2)范围

ios中DEBUG中记住用户名和密码

- (void)viewDidLoad { [super viewDidLoad]; #ifdef DEBUG // 设置测试使用的用户名和密码 self.nameText.text = @“xiaoshuai"; self.pwdText.text = @"123"; [self textChanged]; #endif } ios中DEBUG中记住用户名和密码,布布扣,bubuko.com

在服务器中使用 Entity Framework 的 Migration 更新数据库

在开发环境中,每次我们对要对数据库进行更改,比如增加修改表字段等.改好Entity类后,我们只需在Nuget程序包管理控制台运行 update-database 脚本却可: update-database Entity Framework提供的这个Migration功能非常方便,基本上不用再打开Sql Server Management Studio了.那么如何在发布环境(服务器)中同步我们对数据库的修改呢? 一种方法是在运行 update-database 脚本加上 -verbose 或 -s