Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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
Vba 实现PBKDF2_Vba_Ms Access_Hash_Passwords_Ms Access 2016 - Fatal编程技术网

Vba 实现PBKDF2

Vba 实现PBKDF2,vba,ms-access,hash,passwords,ms-access-2016,Vba,Ms Access,Hash,Passwords,Ms Access 2016,我一直在构建一个自定义访问数据库,并添加了一个带有用户名和密码的登录屏幕。最初我使用SHA1和nosalt来散列密码。(我知道这不是很安全,但它只针对少数用户,不包含个人信息) 然而,公司已经看到了DB应用程序,他们希望安装它并添加更多用户和功能。我想开始使用SALT和PBKDF2来获得密码,但我找不到任何关于带有MS Acess的PBKDF2的信息。下面是我拼凑的两个函数 Public Function PBKDF2(pass As String, salt As String, inter

我一直在构建一个自定义访问数据库,并添加了一个带有用户名和密码的登录屏幕。最初我使用SHA1和nosalt来散列密码。(我知道这不是很安全,但它只针对少数用户,不包含个人信息)

然而,公司已经看到了DB应用程序,他们希望安装它并添加更多用户和功能。我想开始使用SALT和PBKDF2来获得密码,但我找不到任何关于带有MS Acess的PBKDF2的信息。下面是我拼凑的两个函数

Public Function PBKDF2(pass As String, salt As String, inter As Int32) As String

    Set oT = CreateObject("System.Text.UTF8Encoding")
    Dim bytes() As Byte

    TextToHash = oT.GetBytes_4((pass))
    SaltBytes = oT.GetBytes_4((salt))

    Set oRFC = CreateObject("System.Security.Cryptography.Rfc2898DeriveBytes( (TextToHash), (SaltBytes), inter )")

    bytes() = oRFC.GetBytes(16)

    PBKDF2 = ByteArrayToHex(bytes())

End Function


Private Function ByteArrayToHex(ByRef ByteArray() As Byte) As String

    Dim lb As Long, ub As Long
    Dim l As Long, strRet As String
    Dim lonRetLen As Long, lonPos As Long
    Dim strHex As String, lonLenHex As Long

    lb = LBound(ByteArray)
    ub = UBound(ByteArray)
    lonRetLen = ((ub - lb) + 1) * 3
    strRet = Space$(lonRetLen)
    lonPos = 1

    For l = lb To ub
        strHex = Hex$(ByteArray(l))
        If Len(strHex) = 1 Then
            strHex = "0" & strHex
        End If
        If l <> ub Then
            Mid$(strRet, lonPos, 3) = strHex & " "
            lonPos = lonPos + 3
        Else
            Mid$(strRet, lonPos, 3) = strHex
        End If
    Next l

    ByteArrayToHex = strRet

End Function
公共函数PBKDF2(传递为字符串,salt为字符串,inter为Int32)为字符串
Set oT=CreateObject(“System.Text.UTF8Encoding”)
Dim bytes()作为字节
TextToHash=oT.GetBytes_4((通过))
SaltBytes=oT.GetBytes_4((salt))
设置oRFC=CreateObject(“System.Security.Cryptography.Rfc2898DeriveBytes((TextToHash),(SaltBytes),inter)”)
字节()=oRFC.GetBytes(16)
PBKDF2=ByteArrayToHex(字节())
端函数
私有函数ByteArrayToHex(ByRef ByteArray()作为字节)作为字符串
暗磅和长磅一样,暗磅和长磅一样
尺寸l和长度一样,strRet和字符串一样
昏暗的寂寞如长,寂寞如长
尺寸strHex为字符串,lonLenHex为长
lb=LBound(ByteArray)
ub=UBound(ByteArray)
lonRetLen=((ub-lb)+1)*3
strRet=Space$(lonRetLen)
lonPos=1
对于l=磅至磅
strHex=Hex$(ByteArray(l))
如果Len(strHex)=1,则
strHex=“0”和strHex
如果结束
如果我是ub那么
Mid$(strRet,lonPos,3)=strHex&“
lonPos=lonPos+3
其他的
Mid$(strRet,lonPos,3)=strHex
如果结束
下一个l
ByteArrayToHex=strRet
端函数
我得到了错误

“ByRef参数不匹配”


是否有更好的方法在Access VBA中实现PBKDF2,或者这些函数是否有修复程序?

@zaph和@EricvonAsmuth都有有效的观点。看起来,
Rfc2898DeriveBytes
不能直接在VBA中使用。尝试其他路径可能更简单

您可以在线找到本机VB6/VBA SHA1实现。您可以针对在线SHA1生成器测试这些代码,以验证其有效性


根据您对.NET和COM的舒适程度,此方法可能更容易。

1。Rfc2898DeriveBytes是一种方法,您只需要了解如何传递参数并进行调试。2.错误发生在哪里?3.为什么需要将二进制转换为十六进制?只需保存二进制文件,然后进行比较。错误发生在PBKDF2=ByteArrayToHex(字节)处,但这是一个编译错误,而不是运行时错误。此外,它们不需要转换为十六进制,但这就是我存储SHA1哈希的方式,我试图保持一致性我不知道您使用的是什么语言,但它不是VBA!第一条线索:
interas Int32
。正确的VBA类型为
Long
。当我在Access中更正代码并运行它时,它在
Set oRFC=CreateObject处失败("…
行出现
错误429:ActiveX组件无法创建对象
。请编辑您的代码,使其在VBA中编译,并修复
CreateObject
行,如果您有任何其他问题,请重新提交您的问题。但无法修复
CreateObject
。Afaik
Rfc2898DeriveBytes
无法通过COM获得。您需要使用.Net编程语言(VB.Net、C#、C++)创建一个自定义COM类@zaph我想我没有很好地表达它。您无法修复它,因为VBA不支持带参数的构造函数。除了使用不同的编程语言创建不需要参数的COM类之外,我不知道有什么解决方法。