2017-06-12 63 views
0

使用SNMP版本3,我正在創建一個用戶。 現在,我已經設置了我克隆用戶的地方,並且工作得很好。但是,我需要更改新用戶的authKey。我怎樣才能做到這一點?我知道authKeyChange的oid,但是,我不知道如何生成新的密鑰。我如何生成該密鑰?可以使用SNMPSharpNet完成嗎? 如果在創建用戶時有更簡單的方法來做到這一點,我也可以做到這一點。任何改變authKey(和privKey,但一次一步)的方式非常感謝。我使用VB.net,如果它意味着什麼。更改用戶的authKey

+0

大家都說「根據clone-from用戶的祕密 privKey和用於新用戶的密鑰 生成keyChange值」,但沒有人說HOW。 –

回答

0

所以我想出瞭如何做到這一點。這是一個複雜的過程。我跟着this文件,這是rfc2574。爲「keyChange :: =」做一個ctrl + F,你會發現這個段落引導你通過算法來生成keyChange值。以下代碼可靠地生成keyChange值。所有你需要做的就是將keyChange值推送到usmAuthKeyChange OID。如果要更改隱私密碼,請將keyChange值推送到usmPrivKeyChange OID。我很慚愧地說,由於時間緊迫,我沒有時間完成這項工作,所以當使用SHA時,我必須編寫一個全新的方法,幾乎​​完成同樣的事情。再次,我很慚愧地把它貼出來,但我知道我有多麼b against我的頭靠在牆上,如果稍後有人來這裏看到這些,我希望他們知道該怎麼做,而不用經歷鬥爭。

這裏是所有你需要使用VB.Net和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 

同樣,我是如此清楚地知道這個代碼是可怕的,但它的作品,這是我在此期間需要。我知道這是技術性債務,而不是我應該編碼的方式,但它在這裏,我希望你能從中獲得一些用處。

如果這不起作用,不要忘記去frc2574看看算法。