2017-06-12 1 views
0

À 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

+0

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. –

Répondre

0

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.