开发者社区> 科技小能手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

DES加密、数据库密码加密

简介:
+关注继续查看

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
关于用户密码加密
关于用户密码加密
0 0
数据库MD5加密(扩展)
数据库MD5加密(扩展)
0 0
用户密码到底要怎么加密存储?
作为互联网公司的信息安全从业人员经常要处理撞库扫号事件,产生撞库扫号的根本原因是一些企业发生了信息泄露事件,且这些泄露数据未加密或者加密方式比较弱,导致黑客可以还原出原始的用户密码。
0 0
密码加密处理 | 学习笔记
快速学习 密码加密处理
0 0
项目中数据库密码没有加密导致了数据泄露!!
最近,有位读者私信我说,他们公司的项目中配置的数据库密码没有加密,编译打包后的项目被人反编译了,从项目中成功获取到数据库的账号和密码,进一步登录数据库获取了相关的数据,并对数据库进行了破坏。虽然这次事故影响的范围不大,但是这足以说明很多公司对于项目的安全性问题重视程度不够。
0 0
数据库加密
产品简介中安威士数据库透明加密系统(简称VS-EC),基于加密算法和合理的密钥管理,有选择性地加密敏感字段内容,保护数据库内敏感数据的安全。敏感数据以密文的形式存储,能保证即使在存储介质被窃取或数据文件被非法复制的情况下,敏感数据仍是安全的。
1404 0
维吉尼亚密码的加密解密
# -*- coding:utf-8 -*- def weijiniya_jiemi(ciphertext,key): ascii='ABCDEFGHIJKLMNOPQRSTUVWXYZ' keylen=len(key) ctlen=len(ciph...
733 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载