À l'aide de SNMP version 3, je crée un utilisateur. En ce moment, je l'ai installé où je clone un utilisateur et cela fonctionne très bien. Cependant, j'ai besoin de changer le authKey du nouvel utilisateur. Comment puis-je faire ceci? Je connais l'OID pour authKeyChange, cependant, je ne sais pas comment générer la nouvelle clé. Comment puis-je générer cette clé? Peut-il être fait en utilisant SNMPSharpNet? S'il existe un moyen plus simple de le faire pendant que je crée l'utilisateur, je peux le faire aussi. Toute façon de changer l'authKey (et privKey, mais une étape à la fois) est très appréciée. J'utilise VB.net si ça veut dire quelque chose.Modification de authKey d'un utilisateur
Répondre
J'ai donc compris comment faire. C'est un processus un peu complexe. J'ai suivi le document this, qui est rfc2574. Faites un ctrl + F pour "keyChange :: =" et vous trouverez le paragraphe qui vous guide dans l'algorithme pour générer la valeur keyChange. Le code suivant a fonctionné de manière fiable pour générer la valeur keyChange. Tout ce que vous avez à faire à partir de ce point est de pousser la valeur keyChange vers l'OID usmAuthKeyChange. Si vous modifiez le mot de passe de confidentialité, vous devez appliquer la valeur keyChange à l'OID usmPrivKeyChange. J'ai honte de dire qu'en raison du manque de temps, je n'ai pas eu le temps de faire ce travail complètement, alors quand j'ai utilisé SHA, j'ai dû coder une méthode entièrement nouvelle qui faisait presque exactement la même chose. Encore une fois, j'ai honte de l'afficher, mais je sais à quel point je me cognais la tête contre un mur, et si quelqu'un vient ici plus tard et voit cela, je voudrais qu'ils sachent quoi faire sans passer par la lutte.
Voici tout le code dont vous avez besoin en utilisant VB.Net et la bibliothèque SNMPSharpNet:
Private Function GenerateKeyChange(ByVal newPass As String, ByVal oldPass As String, ByRef target As UdpTarget, ByRef param As SecureAgentParameters) As Byte()
Dim authProto As AuthenticationDigests = param.Authentication
Dim hash As IAuthenticationDigest = Authentication.GetInstance(authProto)
Dim L As Integer = hash.DigestLength
Dim oldKey() As Byte = hash.PasswordToKey(Encoding.UTF8.GetBytes(oldPass), param.EngineId)
Dim newKey() As Byte = hash.PasswordToKey(Encoding.UTF8.GetBytes(newPass), param.EngineId)
Dim random() As Byte = Encoding.UTF8.GetBytes(GenerateRandomString(L))
Dim temp() As Byte = oldKey
Dim delta(L - 1) As Byte
Dim iterations As Integer = ((newKey.Length - 1)/L) - 1
Dim k As Integer = 0
If newKey.Length > L Then
For k = 0 To iterations
'Append random to temp
Dim merged1(temp.Length + random.Length - 1) As Byte
temp.CopyTo(merged1, 0)
random.CopyTo(merged1, random.Length)
'Store hash of temp in itself
temp = hash.ComputeHash(merged1, 0, merged1.Length)
'Generate the first 16 values of delta
For i = 0 To L - 1
delta(k * L + i) = temp(i) Xor newKey(k * L + i)
Next
Next
End If
'Append random to temp
Dim merged(temp.Length + random.Length - 1) As Byte
temp.CopyTo(merged, 0)
random.CopyTo(merged, temp.Length)
'Store hash of temp in itself
temp = hash.ComputeHash(merged, 0, merged.Length)
'Generate the first 16 values of delta
For i = 0 To (newKey.Length - iterations * L) - 1
delta(iterations * L + i) = temp(i) Xor newKey(iterations * L + i)
Next
Dim keyChange(delta.Length + random.Length - 1) As Byte
random.CopyTo(keyChange, 0)
delta.CopyTo(keyChange, random.Length)
Return keyChange
End Function
Private Function GenerateKeyChangeShaSpecial(ByVal newPass As String, ByVal oldPass As String, ByRef target As UdpTarget, ByRef param As SecureAgentParameters) As Byte()
Dim authProto As AuthenticationDigests = param.Authentication
Dim hash As IAuthenticationDigest = Authentication.GetInstance(authProto)
Dim L As Integer = 16
Dim oldKey() As Byte = hash.PasswordToKey(Encoding.UTF8.GetBytes(oldPass), param.EngineId)
Dim newKey() As Byte = hash.PasswordToKey(Encoding.UTF8.GetBytes(newPass), param.EngineId)
Array.Resize(oldKey, L)
Array.Resize(newKey, L)
Dim random() As Byte = Encoding.UTF8.GetBytes(GenerateRandomString(L))
Dim temp() As Byte = oldKey
Dim delta(L - 1) As Byte
Dim iterations As Integer = ((newKey.Length - 1)/L) - 1
Dim k As Integer = 0
If newKey.Length > L Then
For k = 0 To iterations
'Append random to temp
Dim merged1(temp.Length + random.Length - 1) As Byte
temp.CopyTo(merged1, 0)
random.CopyTo(merged1, random.Length)
'Store hash of temp in itself
temp = hash.ComputeHash(merged1, 0, merged1.Length)
Array.Resize(temp, L)
'Generate the first 16 values of delta
For i = 0 To L - 1
delta(k * L + i) = temp(i) Xor newKey(k * L + i)
Next
Next
End If
'Append random to temp
Dim merged(temp.Length + random.Length - 1) As Byte
temp.CopyTo(merged, 0)
random.CopyTo(merged, temp.Length)
'Store hash of temp in itself
temp = hash.ComputeHash(merged, 0, merged.Length)
Array.Resize(temp, L)
'Generate the first 16 values of delta
For i = 0 To (newKey.Length - iterations * L) - 1
delta(iterations * L + i) = temp(i) Xor newKey(iterations * L + i)
Next
Dim keyChange(delta.Length + random.Length - 1) As Byte
random.CopyTo(keyChange, 0)
delta.CopyTo(keyChange, random.Length)
Return keyChange
End Function
Private Function GenerateRandomString(ByVal length As Integer) As String
Dim s As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
Dim r As New Random
Dim sb As New StringBuilder
For i As Integer = 1 To length
Dim idx As Integer = r.Next(0, 51)
sb.Append(s.Substring(idx, 1))
Next
Return sb.ToString()
End Function
Encore une fois, je suis oh ce code si bien conscient est affreux, mais il fonctionne, et qui est tout ce que je nécessaire entre-temps. Je comprends qu'il s'agit d'une dette technique et non de la façon dont je devrais coder, mais c'est ici et j'espère que vous pourrez en tirer profit.
Si cela ne fonctionne pas, n'oubliez pas d'aller à frc2574 et regardez l'algorithme.
Tout le monde dit "générer la valeur keyChange basée sur le secret privKey de l'utilisateur clone-from et la clé secrète à utiliser pour le nouvel utilisateur" mais personne ne dit COMMENT. –