1. 怎么对数据库已有的数据进行加密
第一层 服务主密钥 备份服务主密钥
backup service master key to file='c:\smk.bak'
encryption by password='P@ssw0rd'
restore service master key from file='c:\smk.bak'
decryption by password='P@ssw0rd'
第二层 数据库主密钥
1)必须先在该数据库上创建数据库主密钥才能使用
create master key encryption by password='P@ssw0rd'
2)使用数据库主密钥
-如果数据库主密钥使用服务密钥进行保护,则在使用时会自动打开
opren master key decryption by password='P@ssw0rd'
3)查看数据库主密钥状态
sys.symmetric_keys
4)备份数据库主密钥
backup master key to file='c:\smk.bak'
encryption by password='P@ssw0rd'
restore master key from file='c:\smk.bak'
decryption by password='P@ssw0rd'
2. 系统数据安全
部分航空物探项目是带有一定密级的,其项目所取得的成果资料属于保密数据,这部分数据也存储在本系统的数据库中。因此,需防止保密数据被窃走或蓄意破坏,如越权提取数据库保密数据或在通信线路上进行窃听等。对这样的威胁最有效的解决方法就是对数据进行加密处理,把可读的保密数据转化为密码数据,以加密格式存储和传输,在使用时再解密。
航空物探保密项目的密级分机密、秘密、绝密3个密级。本系统仅对保密项目数据进行加密处理,机密和秘密项目资料采用64位密钥进行加密,绝密项目资料采用128位密钥进行加密,非保密项目数据不做任何加密处理。进入资料采集库中的数据通过正确性检查后,归档入库进入资料库时,系统根据设置的项目密级进行自动加密。用户也可以通过加密-解密功能对资料库中的数据进行加密或解密。相同类型的加密数据与未加密数据均存储在资料库同一张表的同一字段中,但在数据加密-解密记录表数据库(表3-8)中,记录了加密数据库表代码和字段代码。当用户获得授权访问保密数据时,系统根据该表中的记录自动对数据进行解密。
表3-8 数据加密-解密记录表数据库结构
一、数据加密与解密
根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。非对称密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。
对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:DES(Data En-cryption Standard),数据加密标准,速度较快,适用于加密大量数据的场合;3DES(Triple DES),是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;AES(Advanced Encryption Standard),高级加密标准,速度快,安全级别高。常见的非对称加密算法有:RSA,由RSA公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件快的长度也是可变的;DSA(Digital Signature Algorithm),数字签名算法,是一种标准的DSS(数字签名标准)。
本系统采用AES和DES加密算法对数据库数据进行加算或解密(图3-4)。
图3-4 数据库数据加密-解密过程
AES加密算法是美国国家标准和技术协会(NIST)2000年10月宣布通过从15种候选加密算法中选出的一项新的密钥加密标准,于2002年5月26日制定了新的高级加密标准(AES)规范。
AES算法基于排列(对数据重新进行安排)和置换(将一个数据单元替换为另一个)运算,采用几种不同的方法来执行排列和置换运算。它是一个迭代的、对称密钥分组的密码,可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密,数据通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。首先,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换(输入的第58位换到第一位,第50位换到第2位,依此类推,最后一位是原来的第7位),最终由L0输出左32位,R0输出右32位。根据这个法则经过16次迭代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出。
二、日志跟踪
为了有效地监控航空物探保密数据的访问,确保保密数据安全,本系统针对保密数据开发了保密数据访问日志跟踪功能。该功能类似于“摄像机”,把访问数据库中保密数据的时间、用户、IP地址等信息记录在数据库的日志库表中,以备侦查。
首先,对保密数据进行日志跟踪定义,即对用户的哪些操作进行跟踪。系统提供了对用户的查询、新增、修改、删除4种操作进行跟踪功能,可以根据需要进行选择其一或多个(图3-5)。
日志跟踪定义生效后,系统自动对用户实施跟踪,并记录用户登录名、登录和退出时间(年/月/日,时/分/秒)、登录计算机的IP地址,用户对数据库数据所进行的查询、新增、修改、删除操作。系统还提供了跟踪日志记录查询、打印、导出Excel表格文件等功能,便于数据库管理人员使用。
图3-5 数据库日志跟踪设置
三、数据提取安全机制
数据提取是航空物探信息系统向地质、地球物理等领域的科研人员提供数据服务的重要内容之一。防止越权提取数据,保证数据安全,是本系统提供优质、高效服务的前提。
越权提取数据是两个方面的问题。一是用户在没有获得授权情况窃取数据,此问题属系统使用安全。二是获得授权的用户擅自扩大提取数据的范围,“顺手牵羊”多提取数据。针对该问题,本系统采用以下机制(图3-6)。
图3-6 数据库数据提取安全机制模型
首先由用户(需要数据的单位或个人)提出使用数据申请,填写使用数据审批表。该表包含申请号、申请人、使用数据的范围(经纬度坐标)、审批人、审批日期、使用数据目的等信息。
用户申请获批准后,与中心签订资料使用保密协议。系统管理员授予用户“数据提取权”,根据批准的申请设置提取数据的范围,和数据提取权的有效期限。
在有效期限内,用户可以提取设定范围内的数据。同时,系统自动在数据提取记录表中记录用户数据提取日志(记录提取数据的范围、数据测量比例尺、数据来源的库表、数据提取人和提取日期等),以备查系统数据安全。
3. java jdbc连接mysql数据库 如何实现用户名密码以及传输数据的加密
你的问题很不清晰。
java jdbc连接mysql数据库
如何实现用户名密码以及传输数据的加密
你是要加密保存的数据,还是加密连接信息?
如果是连接串中的用户名与密码进行加密。恐怕用起来很不方便。
我就当你是要把入库的信息加密。
下边是DES加密的方法。将数据进行DES加密,将加密内容转为16进制内容表示。
--------------------------------------------------------------------------------------------
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class DesTest {
public static void main(String[] args) throws Exception {
// 要加密的数据
String str = "123456";
// 密钥
String strKey = "86337898";
SecretKeySpec key = new SecretKeySpec(strKey.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] byteFina = cipher.doFinal(str.getBytes());
String strFinal = byte2Hex(byteFina);
System.out.println(strFinal);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decByte = hex2Byte(strFinal);
byte[] result = cipher.doFinal(decByte);
System.out.println(new String(result));
}
public static String byte2Hex(byte[] buff) {
String hs = "";
for (int i = 0; i < buff.length; i++) {
String stmp = (Integer.toHexString(buff[i] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs;
}
public static byte[] hex2Byte(String str) {
int len = str.length() / 2;
byte[] buff = new byte[len];
int index = 0;
for (int i = 0; i < str.length(); i += 2) {
buff[index++] = (byte) Integer
.parseInt(str.substring(i, i + 2), 16);
}
return buff;
}
}