DES加密、数据库密码加密

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

    在连接数据时,用户名密码都是明文,最近网上查资料,使用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

相关文章
|
24天前
|
Java 数据安全/隐私保护
des加密+base64编码,base64解码+des解密
des加密+base64编码,base64解码+des解密
22 0
|
30天前
|
SQL 关系型数据库 数据库
OceanBase数据库常见问题之upgrade_post想要不显示明文密码如何解决
OceanBase 是一款由阿里巴巴集团研发的企业级分布式关系型数据库,它具有高可用、高性能、可水平扩展等特点。以下是OceanBase 数据库使用过程中可能遇到的一些常见问题及其解答的汇总,以帮助用户更好地理解和使用这款数据库产品。
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
17天前
|
关系型数据库 MySQL 数据库
mysql数据库密码
mysql数据库密码
|
30天前
|
SQL 关系型数据库 数据库
OceanBase数据库常见问题之录入租户管理员密码时,提示密码检验失败如何解决
OceanBase 是一款由阿里巴巴集团研发的企业级分布式关系型数据库,它具有高可用、高性能、可水平扩展等特点。以下是OceanBase 数据库使用过程中可能遇到的一些常见问题及其解答的汇总,以帮助用户更好地理解和使用这款数据库产品。
|
1月前
|
SQL 关系型数据库 MySQL
阿里云MySQL数据库价格、购买、创建账号密码和连接数据库教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,选择配置和地区,完成支付。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码访问。同地域VPC内的ECS需将IP加入白名单以实现内网连接。参考链接提供详细步骤。
371 3
|
3月前
|
移动开发 JavaScript 安全
js的常见的三种密码加密方式-MD5加密、Base64加密和解密和sha1加密详解总结
js的常见的三种密码加密方式-MD5加密、Base64加密和解密和sha1加密详解总结
112 0
|
1月前
|
编解码 Java Nacos
nacos常见问题之密码加密配置如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
141 0
|
1月前
|
存储 运维 Nacos
nacos常见问题之连接用户名和密码把明文用户名和密码进行加密如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
187 2
|
1月前
|
应用服务中间件 Nacos 数据安全/隐私保护
nacos常见问题之如何用明文密码做加密
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
118 0