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