实战SSM_O2O商铺_44【DES加密】 关键配置信息进行DES加密

简介: 实战SSM_O2O商铺_44【DES加密】 关键配置信息进行DES加密

概述


为了安全,我们需要对数据库的用户名和密码进行加密。

之前的文章 Spring-使用加密的属性文件02


工程结构


20180809215453553.png

DES工具类

package com.artisan.o2o.util;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
 * 
 * 
 * @ClassName: DESUtils
 * 
 * @Description: DES是一种对称加密算法。 所谓对称加密算法就是指使用相同的密钥
 * 
 * @author: Mr.Yang
 * 
 * @date: 2018年8月9日 下午9:09:22
 */
@SuppressWarnings("restriction")
public class DESUtils {
  private static Key key;
  // 设置密钥key
  private static String KEY_STR = "myKey";
  private static String CHARSETNAME = "UTF-8";
  private static String ALGORITHM = "DES";
  static {
    try {
      // 生成DES算法对象
      KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
      // 运行SHA1安全策略
      SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
      // 设置上密钥种子
      secureRandom.setSeed(KEY_STR.getBytes());
      // 初始化基于SHA1的算法对象
      generator.init(secureRandom);
      // 生成密钥对象
      key = generator.generateKey();
      generator = null;
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
  /**
   * 
   * 
   * @Title: getEncryptString
   * 
   * @Description: 获取加密后的信息
   * 
   * @param str
   * 
   * @return: String
   */
  public static String getEncryptString(String str) {
    // 基于BASE64编码,接收byte[]并转换为String
    BASE64Encoder base64encoder = new BASE64Encoder();
    try {
      // 按UTF-8编码
      byte[] bytes = str.getBytes(CHARSETNAME);
      // 获取加密对象
      Cipher cipher = Cipher.getInstance(ALGORITHM);
      // 初始化密码信息
      cipher.init(Cipher.ENCRYPT_MODE, key);
      // 加密
      byte[] doFinal = cipher.doFinal(bytes);
      // byte[] to encode好的String并返回
      return base64encoder.encode(doFinal);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
  /**
   * 
   * 
   * @Title: getDecryptString
   * 
   * @Description: 获取解密之后的信息
   * 
   * @param str
   * 
   * @return: String
   */
  public static String getDecryptString(String str) {
    // 基于BASE64编码,接收byte[]并转换为String
    BASE64Decoder base64decoder = new BASE64Decoder();
    try {
      // 将字符串decode成byte[]
      byte[] bytes = base64decoder.decodeBuffer(str);
      // 获取解密对象
      Cipher cipher = Cipher.getInstance(ALGORITHM);
      // 初始化解密信息
      cipher.init(Cipher.DECRYPT_MODE, key);
      // 解密
      byte[] doFinal = cipher.doFinal(bytes);
      // 返回解密之后的信息
      return new String(doFinal, CHARSETNAME);
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
  // 测试
  public static void main(String[] args) {
    System.out.println(getEncryptString("root"));
    System.out.println(getEncryptString("root"));
    System.out.println(getDecryptString("WnplV/ietfQ="));
    System.out.println(getDecryptString("WnplV/ietfQ="));
  }
}


修改配置文件中的用户名和密码

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/o2o?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
#jdbc.username=root
#jdbc.password=root
jdbc.username=WnplV/ietfQ=
jdbc.password=WnplV/ietfQ=

继承PropertyPlaceholderConfigurer,重写convertProperty方法

package com.artisan.o2o.util;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
/**
 * 
 * 
 * @ClassName: EncryptPropertyPlaceholderConfigurer
 * 
 * @Description: 继承PropertyPlaceholderConfigurer,重写convertProperty
 * 
 * @author: Mr.Yang
 * 
 * @date: 2018年8月9日 下午9:20:04
 */
public class EncryptPropertyPlaceholderConfigurer extends
    PropertyPlaceholderConfigurer {
  // 需要加密的字段数组
  private String[] encryptPropNames = { "jdbc.username", "jdbc.password" };
  /**
   * 对关键的属性进行转换
   */
  @Override
  protected String convertProperty(String propertyName, String propertyValue) {
    if (isEncryptProp(propertyName)) {
      // 解密
      String decryptValue = DESUtils.getDecryptString(propertyValue);
      return decryptValue;
    } else {
      return propertyValue;
    }
  }
  /**
   * 
   * 
   * @Title: isEncryptProp
   * 
   * @Description: 判断该属性是否加密
   * 
   * @param propertyName
   * 
   * @return: boolean
   */
  private boolean isEncryptProp(String propertyName) {
    for (String encryptpropertyName : encryptPropNames) {
      if (encryptpropertyName.equals(propertyName))
        return true;
    }
    return false;
  }
}


配置自定义的EncryptPropertyPlaceholderConfigurer

<bean  class="com.artisan.o2o.util.EncryptPropertyPlaceholderConfigurer"
        p:location="classpath:jdbc.properties"
        p:fileEncoding="utf-8"/> 


20180809220031432.png


测试

启动测试,可以debug调测 ,能正常从数据库加载数据即可


Github地址

代码地址: https://github.com/yangshangwei/o2o

相关文章
|
1月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
550 10
|
2月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
694 1
|
3月前
|
安全 Java 数据库
Jasypt加密数据库配置信息
本文介绍了使用 Jasypt 对配置文件中的公网数据库认证信息进行加密的方法,以提升系统安全性。主要内容包括:1. 背景介绍;2. 前期准备,如依赖导入及版本选择;3. 生成密钥并实现加解密测试;4. 在配置文件中应用加密后的密码,并通过测试接口验证解密结果。确保密码安全的同时,保障系统的正常运行。
271 3
Jasypt加密数据库配置信息
|
10月前
|
存储 安全 数据安全/隐私保护
Docker中配置TLS加密的步骤
我们可以在 Docker 中成功配置 TLS 加密,增强 Docker 环境的安全性,保护容器之间以及与外界的通信安全。需要注意的是,在实际应用中,应根据具体情况进行更细致的配置和调整,确保符合安全要求。同时,定期更新证书和私钥,以保障安全性。
651 60
|
10月前
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
577 60
|
10月前
|
安全 应用服务中间件 网络安全
配置Nginx反向代理实现SSL加密访问的步骤是什么?
我们可以成功地配置 Nginx 反向代理实现 SSL 加密访问,为用户提供更安全、可靠的网络服务。同时,在实际应用中,还需要根据具体情况进行进一步的优化和调整,以满足不同的需求。SSL 加密是网络安全的重要保障,合理配置和维护是确保系统安全稳定运行的关键。
578 60
|
10月前
|
安全 网络协议 网络安全
【Azure 环境】从网络包中分析出TLS加密套件信息
An TLS 1.2 connection request was received from a remote client application, but non of the cipher suites supported by the client application are supported by the server. The connection request has failed. 从远程客户端应用程序收到 TLS 1.2 连接请求,但服务器不支持客户端应用程序支持的任何密码套件。连接请求失败。
265 2
|
10月前
|
SQL 安全 算法
网络安全的隐形盾牌:漏洞防御与信息加密的艺术
【10月更文挑战第36天】在数字世界的海洋中,网络安全犹如一艘船的保护罩,守护着我们的隐私和数据安全。本文将揭开网络安全的神秘面纱,从常见的网络漏洞到先进的加密技术,再到培养必要的安全意识,我们将一步步构建起防御的堡垒。文章不仅分享技术细节,还强调了在个人和组织层面采取积极措施的重要性。
|
11月前
|
SQL 安全 算法
网络安全与信息安全:构建数字世界的防线在数字化浪潮席卷全球的今天,网络安全与信息安全已成为维系社会秩序、保障个人隐私与企业机密的重要基石。本文旨在深入探讨网络安全漏洞的本质、加密技术的前沿进展以及提升安全意识的有效策略,为读者揭示数字时代下信息保护的核心要义。
本文聚焦网络安全与信息安全领域,详细剖析了网络安全漏洞的形成机理、常见类型及其潜在危害,强调了及时检测与修复的重要性。同时,文章系统介绍了对称加密、非对称加密及哈希算法等主流加密技术的原理、应用场景及优缺点,展现了加密技术在保障数据安全中的核心地位。此外,针对社会普遍存在的安全意识薄弱问题,提出了一系列切实可行的提升措施,如定期安全培训、强化密码管理、警惕钓鱼攻击等,旨在引导公众树立全面的网络安全观,共同构筑数字世界的安全防线。
|
11月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
765 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!