让数据库更安全——简要数据库数据加密介绍

数据库技术

前言:在大多数数据库的应用场合,都对数据库本身的安全有一定的要求,除了设置数据库的登录密码以外,对数据库加密也是一种行之有效的安全措施。本文对与数据库加密相关的知识做一个简单的介绍,并通过.NET来实现一个简单的数据库数据加密。

初识加密

我们先来简单地说说加密。有这样一个故事,曾经有一个古代的士兵在抄写文件中首次使用了加密技术。其做法是将文字竖着写,然后将写好的纸横着撕成一条一条的。当纸条传到接收人手中后,按照一定的顺序将这些纸条重新拼好,这就是早期的一种加密方式。

随着计算机的产生,IBM公司的Horst Feistel博士发明了一种专门的特殊算法标准,也就是后来被称为DES即数据加密标准。在这个标准中诞生了很多的加密算法,使加密得到了进一步的推广应用。

现在就对本文使用的加密技术来做个简单介绍。密钥可以这样来理解:X+Y=Z。其中X是要被加密的数据,Y就是密钥,Z是加密后的数据,而加号相当于通过某种算法将密钥作用于原数据。

本文所采用的加密方法是被称为密钥散列值的方法中的HMACSHA算法。此方法将要加密的数据和密钥进行组合产生新的加密了的数据,而实现加密的具体算法则隐藏在相应的类里面。因此实现方法简单,适合广大的读者快速地将它应用到自己的程序中。

利用.NET类实现加密

在.NET中,加密所要使用的类大都集中在System.Security.Cryptography框架中,它包含了多种加密算法,所以我们使用的加密方法也是在System.Security.Cryptography框架中。

在本例中,我们使用VB.net开发。首先我们建立一个工程,然后在一个空白窗体中添加两个命令控件,两个标签控件,两个文本框控件。然后修改命令控件的text属性分别为“加密此数据”和“查询”,标签控件分别为“数据输入”和“查询”,两个文本框控件都为空。要实现数据库数据的加密和对加密后的数据进行查询的主要代码就在两个命令控件的事件代码中,下面我们来分别看看:

1. “加密此数据”按钮代码

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim constr As String

constr = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=pubs;Data Source=ZH;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=ZY;Use Encryption for Data=False;Tag with column collation when possible=False"‘数据库连接字符

Dim con As New System.Data.OleDb.OleDbConnection(constr)

con.Open()‘连接数据库

Dim txt1() As Byte

Dim hmstr As String

txt1 = System.Text.ASCIIEncoding.ASCII.GetBytes(TextBox1.Text)‘载入原始数据

Dim key(16) As Byte

key = System.Text.ASCIIEncoding.ASCII.GetBytes("1") '加密的密钥

'使用HMACSHA算法加密

Dim hma As New System.Security.Cryptography.HMACSHA1(key)

Dim csstream As New System.Security.Cryptography.CryptoStream(System.IO.Stream.Null, hma, Security.Cryptography.CryptoStreamMode.Write)

csstream.Write(txt1, 0, txt1.Length)

csstream.Close()

hmstr = System.Text.ASCIIEncoding.ASCII.GetString(hma.Hash)

Dim instr As String

‘将加密的数据添加到数据库中

instr = "insert into 测试 (密码) values " + "('" + hmstr + "')"

Dim com As New System.Data.OleDb.OleDbCommand(instr, con)

com.ExecuteNonQuery()

con.Close()

End Sub

程序说明:由于我们要将加密的数据保存在数据库中,所以我们需要先对数据库进行连接操作,然后将textbox1中的数据进行加密处理,最后通过数据操作语言和SQL的插入语言将加密后的数据保存到数据库中。

2. “查询”按钮代码

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As Sys tem.EventArgs) Handles Button2.Click

Dim constr As String

constr = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=pubs;Data Source=ZH;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=ZY;Use Encryption for Data=False;Tag with column collation when possible=False"‘数据库的连接字符串

Dim con As New System.Data.OleDb.OleDbConnection(constr)

con.Open()

Dim txt1() As Byte

Dim hmstr As String

txt1 = System.Text.ASCIIEncoding.ASCII.GetBytes(TextBox2.Text)‘要加密的数据

Dim key(16) As Byte

key = System.Text.ASCIIEncoding.ASCII.GetBytes("1") '加密的密钥

'使用HMACSHA算法加密

Dim hma As New System.Security.Cryptography.HMACSHA1(key)

Dim csstream As New System.Security.Cryptography.CryptoStream(System.IO.Stream.Null, hma, Security.Cryptography.CryptoStreamMode.Write)

csstream.Write(txt1, 0, txt1.Length)

csstream.Close()

hmstr = System.Text.ASCIIEncoding.ASCII.GetString(hma.Hash)

Dim sestr As String

sestr = "select 密码 from 测试 where 密码 ='" + hmstr + "'"

Dim com As New System.Data.OleDb.OleDbCommand(sestr, con)‘查询数据库中是否有此记录。

Dim dataread

If com.ExecuteReader(CommandBehav ior.CloseConnection).Read <> 0 Then

MessageBox.Show("数据库中有此记录,查询成功")

Else

MessageBox.Show("数据库中无此记录,查询失败")

End If

con.Close()

End Sub

程序说明:对于此部分的代码来说,首先是和数据库进行连接,然后对textbox2中的文本用相同的方法进行加密,最后就可以通过查询语句查询数据库中的数据。如果数据存在则返回一消息框并显示“数据库中有此记录,查询成功”,如果没有则显示“数据库中无此记录,查询失败”。

小结

通过前面的工作,我们就简单地实现了数据库中的数据加密和查询。仔细看了这两部分代码的朋友,可以发现其实差异并不大,因为都采用了相同的加密方法,然后再进行相应的数据库操作。加密后的数据库数据效果如何呢?如果不用加密查询的话结果如图,还算简单有效吧。

7-g15-1-1.jpg

小提示:特别要注意,如果你的数据库的列长度设置过小,则会引发异常。造成这个问题的原因是HMACSHA加密的数据会是原数据的数倍或数十倍。如果列的设置太小就会无法容纳这些数据。