DES加密、数据库密码加密

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

    在连接数据时,用户名密码都是明文,最近网上查资料,使用DES对其进行加密;同时用户注册后,密码都没有进行加密,对于数据库里面数据加密,可以使用password函数直接进行加密,也可以自定义加密,比如使用DES加密。


一、数据加密的概念

1、  基本概念

    "加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。


2、  基本功能

    1. 防止不速之客查看机密的数据文件;

    2. 防止机密数据被泄露或篡改;

    3. 防止特权用户(如系统管理员)查看私人数据文件;

    4. 使入侵者不能轻易地查找一个系统的文件。


3、  加密形式 

    ①链路加密:通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。根据传递的数据的同步方式又可分为同步通信加密和异步通信加密两种,同步通信加密又包含字节同步通信加密和位同步通信加密。

    ②节点加密:是对链路加密的改进。在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。

    ③端对端加密:网络层以上的加密称为端对端加密。是面向网络层主体。对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。

    

二、数据加密的项目应用

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.Net(C#)中的数据加密

    4、  硬件加密:加密狗

三、数据加密的发展趋势 

    ①私用密钥加密技术与公开密钥加密技术相结合:鉴于两种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。

    ②寻求新算法:跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。如刘尊全先生提出的刘氏算法,是一种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。此种加密算法加密强度高、速度快、计算开销低。

    ③加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制一种加密协处理器。它可以集成到微机的主极上。

四、 网络数据加密算法分类

    1、  根本不考虑解密问题:MD5、

    2、  私用密钥加密:DES、AES

    3、  公用密钥加密:RSA

    4、  数字证书:


五、对称加密之DES加密与解密


    对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。

单钥密码系统的安全性依赖于以下两个因素:

    第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。

    第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。


DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。

    DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

    DES使用的密钥key为8字节,初始向量IV也是8字节。

    TripleDES使用24字节的key,初始向量IV也是8字节。

    两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。

    


六、对数据库连接密码加密具体操作如下:

1.定义DES加密类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public  class  DESUtils {
     private  static  Key key;
     private  static  String KEY_STR =  "qbkeytest" ; // 密钥,必须保证唯一秘密性
     private  static  String CHARSETNAME =  "UTF-8" ; // 编码
     private  static  String ALGORITHM =  "DES" ; // 加密类型
  
     static  {
         try  {
             KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
             //KeyGenerator秘密密钥生成器。
             generator.init( new  SecureRandom(KEY_STR.getBytes()));
             key = generator.generateKey();
             generator =  null ;
         catch  (Exception e) {
             throw  new  RuntimeException(e);
         }
     }
     /**
      * 对str进行DES加密
     
      * @param str
      * @return
      */
     public  static  String getEncryptString(String str) {
         BASE64Encoder base64encoder =  new  BASE64Encoder();
         try  {
             byte [] bytes = str.getBytes(CHARSETNAME); //编码
             Cipher cipher = Cipher.getInstance(ALGORITHM);
             //Cipher类为加密和解密提供密码功能,Cipher类是一个引擎类,它需要通过getInstance()工厂方法来实例化对象
             cipher.init(Cipher.ENCRYPT_MODE, key);
             //// 用于将Cipher初始化为加密模式的常量:public final static int ENCRYPT_MODE  
             //通过两个常量来完成用于加密或是解密操作的初始化
             byte [] doFinal = cipher.doFinal(bytes);
             return  base64encoder.encode(doFinal);
         catch  (Exception e) {
             throw  new  RuntimeException(e);
         }
     }
     
     @Test
     public  void  myTest(){
         System.out.println(getEncryptString( "123" ));
     }
     
     @Test
     public  void  myTest2(){
         System.out.println(getDecryptString( "21O/jNn9VXQ=" ));
    
     /**
      * 对str进行DES解密
     
      * @param str
      * @return
      */
     public  static  String getDecryptString(String str) {
         BASE64Decoder base64decoder =  new  BASE64Decoder();
         try  {
             byte [] bytes = base64decoder.decodeBuffer(str);
             Cipher cipher = Cipher.getInstance(ALGORITHM);
             cipher.init(Cipher.DECRYPT_MODE, key);
             //// 用于将Cipher初始化为解密模式的常量:public final static int DECRYPT_MODE
             byte [] doFinal = cipher.doFinal(bytes);
             return  new  String(doFinal, CHARSETNAME);
         catch  (Exception e) {
             throw  new  RuntimeException(e);
         }
     }
}

2.建立jdbc.properties配置文件,并且导入(commons-dbcp-1.4.jar,commons-pool-1.3.jar)包

1
2
3
4
5
6
7
dbName=my
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql: //localhost:3306/${dbName}
#userName=root
#password= 123456
userName=3z5s3VB5Xng=     //加密后的用户名
password=qcwaNpDb718\=     //加密后的密码

3.建立解密配置文件的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import  org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
 
public  class  EncryptPropertyPlaceholderConfigurer  extends
         PropertyPlaceholderConfigurer {
 
     private  String[] encryptPropNames = {  "userName" "password"  };
     
     @Override
     protected  String convertProperty(String propertyName, String propertyValue) {
         if  (isEncryptProp(propertyName)) {
             String decryptValue = DESUtils.getDecryptString(propertyValue);
             //System.out.println(propertyName + "解密内容:" + decryptValue);
             return  decryptValue;
         else  {
             return  propertyValue;
         }
     }
     /**
      * 判断是否是加密的属性
     
      * @param propertyName
      * @return
      */
     private  boolean  isEncryptProp(String propertyName) {
         for  (String encryptpropertyName : encryptPropNames) {
             if  (encryptpropertyName.equals(propertyName))
                 return  true ;
         }
         return  false ;
     }
}


4.改变spring连接数据库的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- <bean id= "dataSource"  class = "com.mchange.v2.c3p0.ComboPooledDataSource" >
         <property name= "driverClass"  value= "com.mysql.jdbc.Driver" ></property>
         <property name= "jdbcUrl"  value= "jdbc:mysql:///my" ></property>
         <property name= "user"  value= "root" ></property>
         <property name= "password"  value= "123" ></property>
     </bean> -->
     
  <!-- 3 .使用加密版的属性文件 -->
     <bean  class = "com.spring.util.EncryptPropertyPlaceholderConfigurer"
         p:location= "classpath:jdbc.properties"  p:fileEncoding= "utf-8"  />
  
     <context:component-scan base- package = "com.spring.*"  />
  
     <bean id= "dataSource"  class = "org.apache.commons.dbcp.BasicDataSource"
         destroy-method= "close"  p:driverClassName= "${driverClassName}"  p:url= "${url}"
         p:username= "${userName}"  p:password= "${password}"  />


同样对于插入数据库数据加密简单的操作是:

1
2
3
4
public  void  regist(User user) {
         user.setPassword(DESUtils.getEncryptString(user.getPassword()));
         this .getHibernateTemplate().save(user);
     }


以上加密显然还是有点粗糙,更安全的措施,希望之后跟大家交流和我继续学习完善!



本文转自 叫我北北 51CTO博客,原文链接:http://blog.51cto.com/qinbin/1928123

相关文章
|
1月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
166 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
3月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
78 4
2023/11/10学习记录-C/C++对称分组加密DES
|
3月前
|
算法 数据安全/隐私保护 Python
DES加密初探
本文介绍了Python中常用的DES和3DES加解密方法,包括ECB和CBC模式。通过示例代码展示了如何使用`Crypto`和`pyDes`库实现加解密,并讨论了不同的填充方式。最后,通过一道CTF例题,详细解析了从图像中提取密文、进行ASCII转换、Base64解码、凯撒解码和最终的DES解密过程。
113 4
DES加密初探
|
4月前
|
Linux 数据库 数据安全/隐私保护
GBase 数据库 加密客户端---数据库用户口令非明文存放需求的实现
GBase 数据库 加密客户端---数据库用户口令非明文存放需求的实现
|
5月前
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
169 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
5月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
94 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
5月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
317 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
25天前
|
云安全 安全 数据建模
《数字证书:互联网世界的"身份证"与"防盗门"》 ——揭秘网络安全背后的加密江湖
在2023年某深夜,上海陆家嘴金融公司机房遭遇黑客攻击,神秘青铜大门与九大掌门封印的玉牌突现,阻止了入侵。此门象征数字证书,保障网络安全。数字证书如验钞机识别假币,保护用户数据。它通过SSL/TLS加密、CA认证和非对称加密,构建安全通信。证书分为DV、OV、EV三类,分别适合不同场景。忽视证书安全可能导致巨额损失。阿里云提供一站式证书服务,助力企业部署SSL证书,迎接未来量子计算和物联网挑战。
|
3月前
|
安全 算法 网络协议
【网络原理】——图解HTTPS如何加密(通俗简单易懂)
HTTPS加密过程,明文,密文,密钥,对称加密,非对称加密,公钥和私钥,证书加密
|
3月前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。