Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS access加密存储在用户表(SQL)中的用户密码_Sql_Ms Access_Vba - Fatal编程技术网

MS access加密存储在用户表(SQL)中的用户密码

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

我的数据库是连接到SQL表的Access前端,是否有方法加密/散列存储在我的用户表中的密码

我看过一些关于大麻和盐的东西?但不知道如何实施


提前感谢您的帮助

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