2017-06-12 4 views
0

Mit SNMP Version 3 erstelle ich einen Benutzer. Jetzt habe ich es eingerichtet, wo ich einen Benutzer klonen und das funktioniert gut. Ich muss jedoch den AuthKey des neuen Benutzers ändern. Wie kann ich das machen? Ich kenne die Oid für authKeyChange, aber ich weiß nicht, wie man den neuen Schlüssel erzeugt. Wie erzeuge ich diesen Schlüssel? Kann es mit SNMPSharpNet gemacht werden? Wenn es einen einfacheren Weg gibt, dies zu tun, während ich den Benutzer erstelle, kann ich das auch tun. JEDER Weg, den authKey (und privKey, aber einen Schritt nach dem anderen) zu ändern, wird sehr geschätzt. Ich benutze VB.net, wenn es irgendetwas bedeutet.Ändern authKey eines Benutzers

+0

Jeder sagt "generieren den keyChange Wert basierend auf dem geheimen privKey des Klon-from-Benutzer und den geheimen Schlüssel für den neuen Benutzer verwendet werden", aber niemand sagt, wie. –

Antwort

0

Also habe ich herausgefunden, wie das geht. Es ist ein komplexer Prozess. Ich folgte this Dokument, das ist RFC2574. Tun Sie eine Strg + F für "keyChange :: =" und Sie finden den Absatz, der Sie durch den Algorithmus führt, um den keyChange-Wert zu generieren. Der folgende Code hat zuverlässig zum Generieren des keyChange-Werts funktioniert. Alles, was Sie von diesem Punkt aus tun müssen, ist, den keyChange-Wert an die usmAuthKeyChange-OID zu senden. Wenn Sie das Datenschutzkennwort ändern, drücken Sie den Wert für keyChange auf die OIM für usmPrivKeyChange. Ich schäme mich zu sagen, dass ich aufgrund der Zeitkrise keine Zeit hatte, diese Arbeit komplett zu machen, also musste ich bei der Verwendung von SHA eine völlig neue Methode programmieren, die fast genau dasselbe tat. Wieder schäme ich mich, es zu veröffentlichen, aber ich weiß, wie sehr ich meinen Kopf gegen eine Wand schlug, und wenn jemand später hierher kommt und dies sieht, möchte ich, dass sie wissen, was zu tun ist, ohne den Kampf zu bestehen.

Hier ist der gesamte Code Sie VB.Net und die SNMPSharpNet Bibliothek verwenden müssen:

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 

Noch einmal, ich bin ach so wohl bewusst, dieser Code ist scheußlich, aber es funktioniert, und das ist alles, was ich benötigt in der Zwischenzeit. Ich verstehe, dass dies technische Schulden sind und nicht die Art, wie ich programmieren sollte, aber es ist hier und ich hoffe, dass Sie etwas davon nutzen können.

Wenn dies nicht funktioniert, vergessen Sie nicht, zu frc2574 zu gehen und sich den Algorithmus anzusehen.

Verwandte Themen