Hashes-Klasse

    • VB.NET

    Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

      Hashes-Klasse

      Guten Tag

      Ich habe für meinen eigenen Zwecke eine Klasse komplett selbst geschrieben, die die Benutzung von Hashes für mich zumindestens einfacher macht, und diese Klasse möchte ich euch heute zur Verfügung stellen.

      VB.NET-Quellcode

      1. Option Strict On
      2. Imports System.Security.Cryptography
      3. Imports System.Text
      4. Public Class Hash
      5. Public Shared Function GenerateSalt() As Byte()
      6. Dim Rndm As New RNGCryptoServiceProvider
      7. Dim Salt(8) As Byte
      8. Rndm.GetBytes(Salt)
      9. Return Salt
      10. End Function
      11. Public Enum Algorithm
      12. SHA1 = 0
      13. SHA256 = 1
      14. SHA384 = 2
      15. SHA512 = 3
      16. MD5 = 4
      17. RIPEMD160 = 5
      18. HMACMD5 = 6
      19. HMACRIPEMD160 = 7
      20. HMACSHA1 = 8
      21. HMACSHA256 = 9
      22. HMACSHA384 = 10
      23. HMACSHA512 = 11
      24. End Enum
      25. Public Shared Function ComputeHash(ByVal input() As Byte, ByVal ParamArray hashes() As Algorithm) As Byte()()
      26. Dim computedHashes()() As Byte = Nothing
      27. Dim i As Integer = 0
      28. For Each algo As Algorithm In hashes
      29. Select Case algo
      30. Case Algorithm.HMACMD5
      31. Dim hashtype As HMAC = HMACMD5.Create
      32. Dim hash As Byte() = hashtype.ComputeHash(input)
      33. computedHashes(i) = hash
      34. Case Algorithm.HMACRIPEMD160
      35. Dim hashtype As HMAC = HMACRIPEMD160.Create
      36. Dim hash As Byte() = hashtype.ComputeHash(input)
      37. computedHashes(i) = hash
      38. Case Algorithm.HMACSHA1
      39. Dim hashtype As HMAC = HMACSHA1.Create
      40. Dim hash As Byte() = hashtype.ComputeHash(input)
      41. computedHashes(i) = hash
      42. Case Algorithm.HMACSHA256
      43. Dim hashtype As HMAC = HMACSHA256.Create
      44. Dim hash As Byte() = hashtype.ComputeHash(input)
      45. computedHashes(i) = hash
      46. Case Algorithm.HMACSHA384
      47. Dim hashtype As HMAC = HMACSHA384.Create
      48. Dim hash As Byte() = hashtype.ComputeHash(input)
      49. computedHashes(i) = hash
      50. Case Algorithm.HMACSHA512
      51. Dim hashtype As HMAC = HMACSHA512.Create
      52. Dim hash As Byte() = hashtype.ComputeHash(input)
      53. computedHashes(i) = hash
      54. Case Algorithm.MD5
      55. Dim hashtype As MD5 = MD5Cng.Create
      56. Dim hash As Byte() = hashtype.ComputeHash(input)
      57. computedHashes(i) = hash
      58. Case Algorithm.RIPEMD160
      59. Dim hashtype As RIPEMD160 = RIPEMD160.Create
      60. Dim hash As Byte() = hashtype.ComputeHash(input)
      61. computedHashes(i) = hash
      62. Case Algorithm.SHA1
      63. Dim hashtype As SHA1 = SHA1Cng.Create
      64. Dim hash As Byte() = hashtype.ComputeHash(input)
      65. computedHashes(i) = hash
      66. Case Algorithm.SHA256
      67. Dim hashtype As SHA256 = SHA256Cng.Create
      68. Dim hash As Byte() = hashtype.ComputeHash(input)
      69. computedHashes(i) = hash
      70. Case Algorithm.SHA384
      71. Dim hashtype As SHA384 = SHA384Cng.Create
      72. Dim hash As Byte() = hashtype.ComputeHash(input)
      73. computedHashes(i) = hash
      74. Case Algorithm.SHA512
      75. Dim hashtype As SHA512 = SHA512Cng.Create
      76. Dim hash As Byte() = hashtype.ComputeHash(input)
      77. computedHashes(i) = hash
      78. End Select
      79. i += 1
      80. Next
      81. Return computedHashes
      82. End Function
      83. End Class

      Ich möchte keine Kommentare hören, dass diese Klasse sinnlos sei, denn ich habe sie hier veröffentlicht, für diejenigen, die sie gebrauchen können.

      MfG

      Jonas Jelonek

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Jonas Jelonek“ ()

      Hi
      es ist eine extrem hohe Redundanz zu bemerken. Nimm doch einfach ein Enum für die unterstützten Hashverfahren. Btw. erzeugt dieser hier bessere Zufallszahlen, als Random: msdn.microsoft.com/en-us/libra…ryptoserviceprovider.aspx
      Für die Verkettung mehrerer Hashes könntest du einfach ein ParamsArray verwenden und eine For-Schleife darauf setzen. Für String.Eingaben rufst du einfach die zugehörige Funktion mit dem Byte-Array auf.

      Gruß
      ~blaze~
      Also du hast folgendes Enum:

      VB.NET-Quellcode

      1. Public Enum HashAlgorithm
      2. SHA1=1
      3. SHA256
      4. '...

      Die Funktion für deine Verschlüsselung sieht so aus:

      VB.NET-Quellcode

      1. Shared Function Hash(ByVal input() As Byte, Byval ParamArray hashes() As HashAlgorithm) As Byte()

      danach gehst eben mit

      VB.NET-Quellcode

      1. For Each hash As HashAlgorithm In hashes

      die angeforderten Hashwerte durch. Salten könntest z.B. durch eine Überladung und einen Delegaten - oder durch einen weiteren Eintrag in der Enum.

      VB.NET-Quellcode

      1. Public Enum SomeEnum
      2. Salt = 0
      3. SHA1
      4. SHA256
      5. '...


      Gruß
      ~blaze~
      Außerdem ist das hier einfach immer nur rein kopiert:

      VB.NET-Quellcode

      1. If Not Salt Is Nothing Then
      2. Array.Resize(Input, Input.Length + Salt.Length)
      3. Array.Copy(Salt, 0, Input, Input.Length - Salt.Length, Salt.Length)
      4. End If
      5. Dim Hash As String = ""
      6. For Each n In hmacsha.ComputeHash(Input)
      7. Hash += Hex(n).ToString
      8. Next
      9. Return Hash

      Das kannst du alles zusammenpacken und wiederverwendbar implementieren.


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
      Ich möchte mich dafür entschuldigen dass es so lange gedauert hat, dass ich den Code neu geschrieben hab, aber ich hatte viel zu tun.
      Ich habe es jetzt endlich geschafft den Code vollständig zu ändern. Ich hoffe er ist jetzt besser geworden, wenn ihr aber immernoch unschöne Sachen findet, verbessere ich die gerne.

      Der Code ist aktualisiert im ersten Post.

      Gruß Jonas Jelonek
      Ich würde die Methoden dann sogar statisch machen, wenn sie keine Instanz-Abhängigkeit haben. ;) Wäre außerdem noch 'ne Idee, die ganzen Hash-Provider in einem Array zu behalten (dann aber auf Instanz-Ebene) und IDisposable zu implementieren. Bei einem IDisposable.Dispose-Aufruf gibst du alle Provider frei (die implementieren glaub' ich zumindest IDisposable). Den Enum-Eintrag nimmst dann einfach als Index im Array. Wenn der Provider am Index noch Nothing ist, wird er initialisiert. Dazu verwendest du dann eine Func(Of GemeinsamerBasisTyp) in einem separaten Array oder so.

      Gruß
      ~blaze~
      Danke erstmal für die Rückmeldung, damit ich den Code verbessern kann.

      Werde mich, sobald ich Zeit habe, ransetzen und verbessern.

      EDIT: Hab gerade mal probiert mit dem Static aber wenn ich Public Static Shared Function eingebe wird Static unterstrichen und eine Meldung wird angezeigt: "Methoden können nicht als Static deklariert werden".

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Jonas Jelonek“ ()

      Typen sollte man eigentlich nur schachteln, wenn der geschachtelte Typ private ist, also nur wenn ausschließlich der umschließende Typ darauf zugreift. Von daher gehört das Enum nicht in die Klasse, eher gehören Enum und Klasse beide in einen gemeinsamen Namespace.

      Ps:
      Wenn du einen auf @~blaze~: machen willst, dann kannst dus auch objektorientierter angehen, jeden Algorithmus in eine extra Klasse packen, die Streams verarbeiten, und dann wäre es ganz einfach möglich, diese Klassen hintereinenderzuschalten.