MS access加密存储在用户表(SQL)中的用户密码
我的数据库是连接到SQL表的Access前端,是否有方法加密/散列存储在我的用户表中的密码 我看过一些关于大麻和盐的东西?但不知道如何实施MS access加密存储在用户表(SQL)中的用户密码,sql,ms-access,vba,Sql,Ms Access,Vba,我的数据库是连接到SQL表的Access前端,是否有方法加密/散列存储在我的用户表中的密码 我看过一些关于大麻和盐的东西?但不知道如何实施 提前感谢您的帮助Access中没有本机的加密/解密方法,但创建自己的加密/解密并不困难。您可以使用旧的“Zebras”方法,为字母表指定不同的字母(也可以使用一些数字或其他ASCII字符): 然后反向工作以解密: Public Function Decrypt(strvalue As String) As String Const LowerAlpha
提前感谢您的帮助Access中没有本机的加密/解密方法,但创建自己的加密/解密并不困难。您可以使用旧的“Zebras”方法,为字母表指定不同的字母(也可以使用一些数字或其他ASCII字符): 然后反向工作以解密:
Public Function Decrypt(strvalue As String) As String
Const LowerAlpha As String = "abcdefghijklmnopqrstuvwxyz"
Const LowerSub As String = "zebrascdfghijklmnopqtuvwxy" 'zebras
Const UpperAlpha As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const UpperSub As String = "ZEBRASCDFGHIJKLMNOPQTUVWXY" 'ZEBRAS
Dim lngi As Long
Dim lngE As Long
Dim strDecrypt As String
Dim strLetter As String
If strvalue & "" = "" Then Exit Function
'Reverse the ROT13 cipher
For lngi = 1 To Len(strvalue)
strDecrypt = strDecrypt & Chr(Asc(Mid(strvalue, lngi, 1)) - 13)
Next
'Now reverse the encryption
For lngi = 1 To Len(strDecrypt)
strLetter = Mid(strDecrypt, lngi, 1)
Select Case Asc(strLetter)
Case 65 To 90 'Uppercase
'Find position in sub string
For lngE = 1 To Len(UpperSub)
If Mid(UpperSub, lngE, 1) = strLetter Then GoTo USub
Next
USub:
Decrypt = Decrypt & Mid(UpperAlpha, lngE, 1)
Case 97 To 122 'Lowercase
'Find position in sub string
For lngE = 1 To Len(LowerSub)
If Mid(LowerSub, lngE, 1) = strLetter Then GoTo LSub
Next
LSub:
Decrypt = Decrypt & Mid(LowerAlpha, lngE, 1)
Case Else 'Do not substitute
Decrypt = Decrypt & strLetter
End Select
Next
End Function
不幸的是,如果修改或加密链接表中的连接,您将发现无法连接到SQL serer。这里任何关于使用“加密”例程的建议都不会起作用,也不相关,因为如果修改或弄乱链接表中的连接字符串,则链接表将失败。因此,唯一可行的方法是使用用户ID和密码清晰可见的计划文本connect字符串进行加密连接、解密并重新链接到SQL server。此时,任何将光标放在链接表上的用户都可以清楚地看到用户id和密码(因此,通过这种建议的方法,您的收益微乎其微)。 这两种解决方案是: 1–在SQL server上使用windows身份验证。这意味着Access链接表中的纯文本连接不需要用户id和密码 2–使用缓存登录。这是推荐的解决方案 因此,在连接字符串中不包含uid和密码。因此,无需担心用户查看连接字符串 因此,在启动时执行登录。当您执行SQL登录时,所有没有用户ID/密码的链接表现在都可以工作了 因此,我使用的登录代码如下:
Function TestLogin(strcon As String) As Boolean
On Error GoTo TestError
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb()
Set qdf = dbs.CreateQueryDef("")
qdf.Connect = strcon
qdf.ReturnsRecords = False
'Any VALID SQL statement that runs on server will work below.
' this does assume user has enough rights to query built in
' system tables
qdf.SQL = "SELECT 1 as test"
qdf.Execute
TestLogin = True
Exit Function
TestError:
TestLogin = False
Exit Function
End Function
这里详细介绍了如何实现这一点:
增强提示:提高数据库连接的安全性
加密连接字符串没有什么意义,因为在启动时,您现在必须使用可见的普通连接字符串重新链接。更糟糕的是,在关机时,您必须重新链接表增益,否则它们都将处于链接状态,完全可以看到uid/密码
这样的过程不仅耗时,而且容易失败,如果应用程序关闭不正确,那么使用自定义链接的“建议”方案不仅会失败,而且是不切实际的解决方案
因此,使用缓存的登录和密码导致不必在这些字符串中包含密码和登录。您可以提示用户输入uid/密码,执行登录,现在所有链接表(如magic)都将使用该登录/密码,并且不必进行链接,因此您不必将用户ID/登录存储在应用程序或链接表连接字符串中。没有“内置”方法来执行此操作。您必须编写自己的加密/解密例程…并将它们隐藏在用户无法触及的地方。我们在Access VBA模块中开发了自己的,运行良好。取决于你是想让SQL Server做这件事,还是想访问它,我刚刚用“SQL Server module to encrypt decrypt strings”(SQL Server module to encrypt decrypt strings)在谷歌搜索了一下,找到了很多建议/代码。伙计们!我们讨论的是链接到SQL server的表。这意味着用户id和密码是纯文本的。您不能“修改”或加密连接字符串,因为这样连接字符串将无法工作。向这里的每个人解释SQL server将如何接受链接表中的“咀嚼”连接字符串?为什么您认为它们是“纯文本”?你可以把它们放在十六进制中,然后把它们去十六进制,它工作得非常好。我们已经这样做了很多次,我保证我可以给你发送代码,将工作。十六进制不是“纯文本”。此外,OP甚至不是在谈论连接字符串,他是在谈论密码。不,不,如果SQL server的链接表被更改或十六进制或其他任何内容,则它们将无法工作。链接到SQL server的talbes仅在纯文本时有效。您必须取消crpt,然后在链接表中保存未加密的字符串。此时,您的表有纯jaine文本,甚至只需将光标悬停在表上即可显示密码。无法工作。我们讨论的是一个链接到SQLServer的表。在access中,连接字符串是纯文本的,如果修改用户名并传递word,则链接表将失败。那么,当用户ID/登录使用上述方法加密,因此uid/密码与SQL server使用的实际用户ID/密码不匹配时,到SQL的链接如何工作?你在开玩笑吧?你是MVP,你应该知道这一点!如果您启动应用程序时没有使用任何encypt8on,并且查看connecton字符串,您将看到uid/密码为纯文本。如果我启动您的应用程序,那么我将再次看到uid/密码为纯文本。您建议在启动时取消crypot并重新链接,因此在这两种情况下(有或没有您的建议),打开该数据库的简单操作将导致用户能够完全看到连接字符串。任何链接表的导出或不正确的关闭都意味着uid/密码处于完全可见状态的未加密表仍然处于完全可见状态。不,您根本没有解释表链接如何工作。是的,请解释一下。
Function TestLogin(strcon As String) As Boolean
On Error GoTo TestError
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb()
Set qdf = dbs.CreateQueryDef("")
qdf.Connect = strcon
qdf.ReturnsRecords = False
'Any VALID SQL statement that runs on server will work below.
' this does assume user has enough rights to query built in
' system tables
qdf.SQL = "SELECT 1 as test"
qdf.Execute
TestLogin = True
Exit Function
TestError:
TestLogin = False
Exit Function
End Function