如何在Excel VBA项目中保护ADO连接?

时间:2016-12-12 09:25:14

标签: sql-server excel vba security ado

我有一个Excel电子表格(.xlsb),它通过VBA中的ActiveX数据对象(ADO)连接到SQL Server,我必须与一群人共享。代码使用以下字符串连接数据库:

' Create the connection string.
sConnString = "Provider=SQLOLEDB;" & _
              "Data Source={server name};" & _
              "Initial Catalog={database name};" & _
              "UserId={username};" & _
              "Password={password};"

如何保护我的SQL用户名和密码安全并阻止第三方获取对它们的访问权限?密码保护VBA项目还是很容易破解?

2 个答案:

答案 0 :(得分:2)

VBA密码保护不能被视为安全,因为它很容易被规避。

您当然可以在VBA代码中添加某种混淆(散列函数或类似函数),以便密码在纯文本中不可见,但是任何熟悉VBA的人都应该能够解决这个问题。时间。

我会考虑使用仅包含所需数据的视图来限制对数据库的访问。

隐藏密码可以通过将连接功能放在dll中来完成,然后在VBA代码中引用该dll。这将需要更多工作来反转,并为您提供更多隐藏凭据的可能性。另请参阅此回复:https://stackoverflow.com/a/19163256/5970009

答案 1 :(得分:2)

VBA项目足够保护 - 任何有2小时空闲时间和互联网的人都可以通过。

什么是基本情况场景是使不同用户在数据库级别上具有不同的权限。然后在Excel电子表格中询问您的用户,在其中一个单元格中或通过userform提供密码和用户名。获取密码和用户名,并在连接字符串中使用它。

作为安全的又一步,您可以使用一个小技巧,我称之为salting。例如。假设您的给定用户的密码为vityata。然后要求用户输入它。输入后,请输入密码并将其更改为其他内容。这个别的东西应该是数据库的密码。我的意思是这样的:

Public Function str_generator(ByVal str_value As String, ByVal b_fix As Boolean) As String

    Dim l_counter As Long
    Dim l_number As Long
    Dim str_char As String

    On Error GoTo str_generator_Error

    If b_fix Then
        str_value = Left(str_value, Len(str_value) - 1)
        str_value = Right(str_value, Len(str_value) - 1)
    End If

    For l_counter = 1 To Len(str_value)
        str_char = Mid(str_value, l_counter, 1)
        If b_is_odd(l_counter) Then
            l_number = Asc(str_char) + IIf(b_fix, -2, 2)
        Else
            l_number = Asc(str_char) + IIf(b_fix, -3, 3)
        End If

        str_generator = str_generator + Chr(l_number)

    Next l_counter

    If Not b_fix Then
        str_generator = Chr(l_number) & str_generator & Chr(l_number)
    End If

    On Error GoTo 0
    Exit Function

str_generator_Error:

    MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure str_generator of Function Modul1"

End Function

Private Function b_is_odd(l_number As Long) As Boolean

    b_is_odd = l_number Mod 2

End Function

假设用户密码为vityata。然后在用户输入后,它将更改为cxlv|cwcc,这是数据库的真实密码。

?str_generator("vityata",false)
cxlv|cwcc
?str_generator("cxlv|cwcc",true)
vityata