加密数据转可见字符_VB.NET数据库操作核心sdk-第02篇

.NET操作中,核心部分就是对于数据库的操作。其中涉及读取数据、更新数据、采用事务操作等等。

上一篇,在写此核心类库前的准备,身份验证类。因为现在操作基本以SQL Server数据库操作居多,因此此类库操作以ms sql为主。

1、新类库继承

由于身份验证类是基类,继承后需要对于基类函数进行重写。

    ''' <summary>
    ''' 2019.8.12
    ''' 操作数据库类库
    ''' </summary>
    Public Class BaseSql
        Inherits SecuriVerify(Of string,string,string)

        Public Overrides ReadOnly Property ErrMessage As String
            Get
                Throw New NotImplementedException()
            End Get
        End Property

        Protected Overrides ReadOnly Property ProcLevel As EmpowerLevel
            Get
                Throw New NotImplementedException()
            End Get
        End Property

        Protected Overrides ReadOnly Property SecuriPass As Integer
            Get
                Throw New NotImplementedException()
            End Get
        End Property

        Protected Overrides Sub ExportMessage(vMsg As String)
            Throw New NotImplementedException()
        End Sub

        Friend Overrides Function CheckCode(vUserName As String, vCode As String) As Integer
            Throw New NotImplementedException()
        End Function

        Friend Overrides Function ProcPermission(vCode As String) As EmpowerLevel
            Throw New NotImplementedException()
        End Function
    End Class

其中继承基类 SecuriVerify 定义泛型参数,在继承的时候为了后续方便操作,默认string类型

2、类库重构

对于类库今后的调用重构函数设计就显得比较重要,此为调用类库入口

设计思路:

  • 我们提供开发用户,需要提供用户名、加密的授权码和校验码,新建一个带3个参数的重构函数
        ''' <summary>
        ''' 说明:重构  
        ''' </summary>
        ''' <param name="vUserName">用户名</param>
        ''' <param name="vSecuriKey">类授权代码</param>
        ''' <param name="vProcKey">过程及函数使用授权码</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal vUserName As String, ByVal vSecuriKey As String, ByVal vProcKey As String)

            MyBase.New(vUserName, vSecuriKey, vProcKey)
        End Sub
  • 有时候为了方便调用,希望三个参数改为一个参数传递,为此我们需要创建一个类调用身份验证结构类型
    ''' <summary>
    ''' 创建时间:2019.8.12
    ''' 说明:类调用身份验证结构类  
    ''' </summary>
    ''' <remarks></remarks>
    Public Structure UserSecurity
        Public UserName As String '//用户名
        Public SecuriKey As String '//类验证码
        Public ProcKey As String '//类过程及函数验证
    End Structure
  • 对于重构函数进行重载操作
        ''' <summary>
        ''' 说明:重构函数  
        ''' </summary>
        ''' <param name="vUserSecurity">用户安全认证信息</param>
        ''' <remarks></remarks>
        Public Sub New(ByVal vUserSecurity As UserSecurity)
            MyBase.New(vUserSecurity.UserName, vUserSecurity.SecuriKey, vUserSecurity.ProcKey)
        End Sub
  • MyBase介绍:

MyBase关键字的行为方式类似于引用当前类实例的基类的对象变量;

MyBase 通常用于访问派生类中被重写或被隐藏的基类成员;

MyBase.New 用于从派生类构造函数中显式调用基类构造函数;

MyBase只能引用直接父类,无法继续沿继承链向上定位;

MyBase可以从父类中调用或使用任何Pulbic,Friend,Protected元素;

无论是重写还是隐藏,它都能突破这种限制,访问父类方法。如果说Me是墙头草,那么MyBase就是定神针,不为外界影响,直接可以引用基类元素。

考虑到调用类库,防止数据库长时间的尝试连接没有反馈的情况,需要设置一个超时时限属性

        ''' <summary>
        ''' 连接数据库超时时间
        ''' </summary>
        ''' <returns></returns>
        Protected MConnectionTimeOut  As Integer=1200
        ''' <summary>
        ''' 说明:设置超时时间  
        ''' </summary>
        ''' <value></value>
        ''' <remarks></remarks>
        Public WriteOnly Property ConnectionTimeOut As Integer
            Set(value As Integer)
                MConnectionTimeOut = value
            End Set
        End Property

3、加密解密类库

由于从外部传递过来的授权码和校验码都是加密的字符串,因此需要机密函数来进行处理

我这里新建了一个Entry加密类

    ''' <summary>
    ''' 创建时间:2019.8.12
    ''' 说明:加密解密类  
    ''' 作者:kevin zhu  
    ''' </summary>
    ''' <remarks></remarks>
    Public Class Entry
        ''' <summary>
        ''' 说明:对字符串进行des对称加密,返回加密后的字符串  
        ''' </summary>
        ''' <param name="sourceStr">需要加密的字符串</param>
        ''' <param name="myPassKey">加密使用的Des.key(8位字符串)</param>
        ''' <param name="myPassCheckCode">加密使用的参考Des.LV(8位字符串)</param>
        ''' <returns>返回加密后的字符串</returns>
        ''' <remarks></remarks>
        Public Shared Function Encrypt(ByVal sourceStr As String, ByVal myPassKey As String, ByVal myPassCheckCode As String) As String
            Dim des As New System.Security.Cryptography.DESCryptoServiceProvider '//定义DES算法
            Dim inputByteArray As Byte()
            inputByteArray = System.Text.Encoding.Default.GetBytes(sourceStr)
            des.Key = System.Text.Encoding.UTF8.GetBytes(myPassKey) '//mypasskey des用8个字符.
            des.IV = System.Text.Encoding.UTF8.GetBytes(myPassCheckCode) '//myPassCheckCode, desc用8个字符
            Dim ms As New System.IO.MemoryStream
            Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)
            Dim sw As New System.IO.StreamWriter(cs)
            sw.Write(sourceStr)
            sw.Flush()
            cs.FlushFinalBlock()
            ms.Flush()
            Encrypt = Convert.ToBase64String(ms.GetBuffer(), 0, ms.Length)
        End Function



        ''' <summary>
        ''' 说明:对于DES对称加密的字符串,进行解密操作,返回真实字符串  
        ''' </summary>
        ''' <param name="sourceStr">加密字符串</param>
        ''' <param name="myPassKey">与加密对称使用的Des.key(字符串8长度)</param>
        ''' <param name="myPassCheckCode">与加密使用的参考Des.LV(字符串8长度)</param>
        ''' <returns>返回被解密后的字符串</returns>
        ''' <remarks></remarks>
        Public Shared Function Decrypt(ByVal sourceStr As String, ByVal myPassKey As String, ByVal myPassCheckCode As String) As String    '使用标准DES对称解密  

            Try
                Dim des As New System.Security.Cryptography.DESCryptoServiceProvider 'DES算法  
                des.Key = System.Text.Encoding.UTF8.GetBytes(myPassKey) 'myKey DES用8个字符,TripleDES要24个字符  
                des.IV = System.Text.Encoding.UTF8.GetBytes(myPassCheckCode) 'myIV DES用8个字符,TripleDES要24个字符  
                Dim buffer As Byte() = Convert.FromBase64String(sourceStr)
                Dim ms As New System.IO.MemoryStream(buffer)
                Dim cs As New System.Security.Cryptography.CryptoStream(ms, des.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Read)
                Dim sr As New System.IO.StreamReader(cs)
                Decrypt = sr.ReadToEnd()
            Catch ex As Exception
                Decrypt = "FALSE," + ex.Message
            End Try
            Return Decrypt

        End Function
    End Class

采用数据加密标准DES加密算法,其是一种对称加密算法,DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。加密运算、解密运算使用的是同样的密钥

特点是数据加密标准,速度较快,适用于加密大量数据的场合。

只要确保密钥别丢失,这个破解有难度。

4、重写基类函数

基类SecuriVerify最核心的是2个函数

  • CheckCode 身份授权校验函数
        ''' <summary>
        ''' 说明:进行类身份验证  
        ''' </summary>
        ''' <param name="vUserName">用户名</param>
        ''' <param name="vCode">类授权验证码</param>
        ''' <returns>返回授权是否通过。1=通过,0=不通过</returns>
        ''' <remarks></remarks>
        Friend Overrides Function CheckCode(vUserName As String, vCode As String) As Integer
            Dim strPass As String
            MSecuriPass = 0
            Try
                strPass = Entry.Decrypt(vUserName, "password", "drowssap") + Entry.Decrypt(vCode, "password", "drowssap")


                Select Case strPass
                    Case "abcd1234"
                        MSecuriPass = 1

                End Select
            Catch ex As Exception
                MErrMessage = ex.Message
            End Try

            Return MSecuriPass
        End Function

其中“password”,"drowssap"密钥,需要保管好。 解密后的字符串信息,如果符合要求,就输出验证通过,否则就验证失败。

等于不同用户有不同的输出结果

  • ProcPermission 授权等级返回
        ''' <summary>
        ''' 说明:返回类中函数及过程授权等级  
        ''' </summary>
        ''' <param name="vCode">函数及过程使用授权码</param>
        ''' <returns>返回授权等级</returns>
        ''' <remarks></remarks>
        Friend Overrides Function ProcPermission(ByVal vCode As String) As EmpowerLevel
            Dim vKey As String
            MProcLevel = EmpowerLevel.Z
            Try
                vKey = Entry.Decrypt(vCode, "password", "drowssap")
                Select Case vKey
                    Case "19001900"
                        MProcLevel = EmpowerLevel.A
                    Case "18001800"
                        MProcLevel = EmpowerLevel.B
                    Case Else
                        MProcLevel = EmpowerLevel.Z
                End Select
            Catch ex As Exception
                ExportMessage(ex.Message)
            End Try

            Return MProcLevel
        End Function

主要是对校验码进行解密,获取授权等级

5、构造查询数据库操作

其操作主要是对于http://ADO.NET操作使用,http://ADO.NET与之前ADO已经存在本质的区别

可以先看下http://ADO.NET结构

b3875bf1d9f56c92ed53b34dfc18e80b.png
  • DataSet通过DataAdapter从数据库中获取数据
  • DataSet对象内部包括一个集合(Tables),也就是可以拥有多个表(DataTables);每个表存放着从数据库放回的一个结果集(一般由一条SELECT语句产生一个结果集)
  • DataTable对象包含一个行集合(Rows),集合中的每个元素都是一个DataRow类型的对象。DataRow提供了通过下标或者列名进行访问字段数据的操作
  • DataTable对象还包含一个列集合(Columns),集合中的每个元素都是一个DataColumn类型的对象,用于代表查询结果集合中每一列的属性,例如名称、数据类型等
  • DataSet对象包含一个关联集合(Relations),集合中的每一个DataRelation代表两个表之间的关联。请注意,数据库表之间的关联不会被自动带到DataSet中来,需要变成为DataSet中的SataTable建立关联
  • 可以由DataTable创建(DataView),DataView可以用来代表DataTable中经过过滤后的数据,并且将用来绑定到数据展现控件中

通俗说法:通过DataAdapter从数据库读取数据,建立一个离线数据库dataset,并且创建一个datatable(数据库表),用户可以操作和读取此表,这个好处在于可以离线作业,不像早期的ADO,都是在线操作,人数使用较多考验数据库性能。

我们可以先看源码,看函数ExecuteDataset

        ''' <summary>
        ''' 说明:执行查询sqlcommand,返回记录集Dataset  
        ''' </summary>
        ''' <param name="vSqlcon">sqlconnection参数</param>
        ''' <param name="vcommandType">命令类型</param>
        ''' <param name="vcommandText">SQL查询语句</param>
        ''' <param name="vSqlpara">参数数组</param>
        ''' <returns>数据记录集Dataset</returns>
        ''' <remarks></remarks>
        Friend Overloads Function ExecuteDataset(ByVal vSqlcon As SqlConnection,
                                                        ByVal vcommandType As CommandType,
                                                        ByVal vcommandText As String,
                                                        ByVal ParamArray vSqlpara() As SqlParameter) As DataSet


            Dim vSqlcmd As New SqlCommand()
            Dim ds As New DataSet()
            Dim da As SqlDataAdapter
            Try
                '//配置sqlcommand
                '//如果连接未打开,则打开连接
                If vSqlcon.State <> ConnectionState.Open Then

                    vSqlcon.Open()
                End If

                With vSqlcmd
                    '//设置sqlcommand对应数据库连接
                    .CommandTimeout = MConnectionTimeOut
                    .Connection = vSqlcon
                    .CommandText = vcommandText '//操作SQL命令
                    .CommandType = vcommandType '//命令操作类型
                    '//如果存在参数数组,则添加到sqlcommand
                    If Not (vSqlpara Is Nothing) Then
                        '  AttachParameters(vSqlcmd, vSqlpara)
                        Dim p As SqlParameter
                        For Each p In vSqlpara
                            '//参数可输出也 可输入

                            If p.Direction = ParameterDirection.InputOutput And p.Value Is Nothing Then
                                p.Value = Nothing
                            End If
                            '对于存储过程,有些参数是输出 
                            If p.Direction = ParameterDirection.Output Then
                                '//sqlcommand添加参数变量
                                vSqlcmd.Parameters.Add(p).Direction = ParameterDirection.Output
                            Else
                                '//sqlcommand添加参数变量
                                vSqlcmd.Parameters.Add(p)
                            End If

                        Next
                    End If
                End With
                'create the DataAdapter & DataSet
                da = New SqlDataAdapter(vSqlcmd)
                da.Fill(ds)
                '//清理sqlpara
                vSqlcmd.Parameters.Clear()
                '关闭连接池 
                F_CancelConn(vSqlcon)
            Catch ex As Exception
                '//销毁链接及操作命令
                F_CancelConn(vSqlcon)
                F_CancelCommand(vSqlcmd)
                ExportMessage(ex.Message) '传输错误信息出去
            End Try

            Return ds

        End Function
 

为何写成Friend Public,此函数为核心函数,并不想让用户直接调用,不方便控制用户调用权限。我们集成身份验证基类目的就是管控权限,自然不可能让用户直接调用此函数,因此我们需要重新创建一个调用函数

调用函数F_GetDataTable

        ''' <summary>
        ''' 说明:执行查询SQL语句,返回记录集内存库表DataTable   
        ''' </summary>
        ''' <param name="commandText">数据库链接字符串</param>
        ''' <param name="commandType">命令类型</param>
        ''' <param name="commandParameters">SQL语句</param>
        ''' <param name="vConnection">数据库链接字符串</param>
        ''' <returns>返回内存库表DataTable</returns>
        ''' <remarks></remarks>
        Public Overloads Function F_GetDataTable(
                                                ByVal commandText As String,
                                                ByVal commandType As CommandType,
                                                ByVal commandParameters As SqlParameter(), ByVal vConnection As String) As DataTable
            Dim dt As New DataTable
            If MProcLevel > EmpowerLevel.D Then
                ExportMessage("你无权限调用此函数")
                Return dt
            Else
                '//数据库链接字符串
                Dim cn As New SqlConnection(vConnection)
                Dim ds As New DataSet
                Try
                    If cn.State <> ConnectionState.Open Then

                        cn.Open()
                    End If
                    ds = ExecuteDataset(cn, commandType, commandText, commandParameters)
                    dt = ds.Tables(0)
                    Return dt
                Finally
                    cn.Dispose()
                End Try
                Return dt
            End If

        End Function

此函数在调用前,会验证用户的授权等级,来决定是否可以调用。这个等级设置,开发用户可以根据函数的重要性和功能性来决定调用等级。

上述是通过http://ADO.NET查询数据库,返回记录的操作,通过继承身份验证基类,提高函数的安全性,再加上加密工具,基本可以保证类库不被随便调用。

后续还要讲解数据库更新操作函数,敬请期待第三篇

类库源码放在github ,喜欢的朋友可以下载,顺便帮忙点个赞。

https://github.com/chenfeng1029/LINKCommon

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值