我有一个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项目还是很容易破解?
答案 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