Autor Beitrag
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mi 26.06.13 10:25 
Heyho,

nach langer Pause meld ich mich hier mal wieder und wie immer hab ich ein mehr oder weniger kleines Problem bei dem ich selbst nicht so recht weiter weiß.
Ich möchte eine ID aus den Hardwaredaten des PCs berechnen um damit eine Lizenzprüfung durchzuführen. Dazu hol ich mir die Daten aus der WMI, pack die alle in einen String und errechne dann daraus einen 4 Byte großen Hash. Problem dabei ist, das der Hash möglichst kollisionsfrei sein sollte und die Frage ist wie ich das am besten hin bekomm. Gibt es vlt. schon einen standardisierten Hash der mir einen 4 Byte großen Wert ausspuckt, oder muss ich mir wirklich die Mühe machen und selbst einen implementieren und testen?

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mi 26.06.13 10:48 
Wenn es nicht kryptografisch sicher sein muss, dann reicht doch sowas wie CRC32 aus, oder?

_________________
We are, we were and will not be.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 26.06.13 10:57 
Die üblichen guten Hashverfahren sollten so ~random~ in ihrer Bitfolge sein das man einfach einen nehmen und auf die gewünschte Länge kürzen kann (also einfach nur die ersten 32 bit nehmen). Die Kollisionswahrscheinlichkeit sollte sich nur um den Faktor der konkret benutzen Hashlänge ändren.

Das ist aber mehr eine Vermutung. Den Beweis(oder Wiederlegung) müßte jemand liefern mit mehr Begabung für Mathe.
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Mi 26.06.13 11:06 
Das Abschneiden eines kryptografischen Hashwertes ist sicher im Rahmen der Geburtstagsparadox-Grenze, vgl. de.wikipedia.org/wiki/Geburtstagsparadox. Das heißt, beim Abschneiden auf 32-Bit mußt Du verstärkt mit Kollisionen rechnen, wenn mehr als ca 2^16 ~ 65000 IDs ins Spiel kommen.

Gruß Gammatester

Edit: Im englischen Wiki findest Du eine Wahrscheinlichkeitstabelle mit einer Zeile für 32-Bit, zB 75% Kollisionswahrscheinlichkeit für ca 110000 IDs.
Christian213
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66
Erhaltene Danke: 3

Win XP, Win 7 64Bit
Lazarus 1.0.10
BeitragVerfasst: Mi 26.06.13 11:17 
Warum soll der Hash nur 4 Byte groß sein?
Wenn es kein "Platzproblem" beim Speichern der Hashes gibt, würde ich einfach einen SHA1 oder so benutzen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 26.06.13 11:25 
Ok. Da von einem simplen Faktor zu sprechen war sicherlich unpassend.

Aber es wiederlegt noch nicht meine Vermutung das ein auf 32bit gekürzter längerer Hash (egal ob MD5 oder SHA-irgendwas) nicht wirklich schlechter wäre als ein Verfahren das gleich 32bit auswirft. Ob 4Byte überhaupt grundsätzlich ausreichen können um ein tolerierbares Kollisionsrisiko zu haben ist eine andere Frage. Wo liegt user profile iconBergmann89s Schmerzgrenze?
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Mi 26.06.13 11:36 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Ok. Da von einem simplen Faktor zu sprechen war sicherlich unpassend.

Aber es wiederlegt noch nicht meine Vermutung das ein auf 32bit gekürzter längerer Hash (egal ob MD5 oder SHA-irgendwas) nicht wirklich schlechter wäre als ein Verfahren das gleich 32bit auswirft.
Richtig, es ist nicht schlechter, sondern besser als zB CRCs (das war übrigens keine Kritik an Deinem Beitrag)! Für alle endlichen Verfahren gibt es halt Kollisionen, wie man sich leicht an 8-Bit-IDs etc klar macht (im Gegensatz zu Marketingversprechen die totale Sicherkeit in 16-Bit-Codes packen).
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 26.06.13 11:46 
Zitat:
(das war übrigens keine Kritik an Deinem Beitrag)


Und wenn wäre auch nicht schlimm ;)
Bergmann89 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Mi 26.06.13 17:55 
Hey,

in diesem Fall ist der Speicher wirklich begrenzt, deshalb waren nur 4 byte vorgesehen. An CRC32 hab ich auch schon gedacht, aber da hab ich in nem anderen Forum gelesen, dass das in diesem Fall ungeeignet ist, da es wohl mehr Kollisionen geben würde (keine Ahnung ob das stimmt). Ein Arbeitskollege von mir hat einen anderen HashAlgo gefunden, der Int64 Hashs generiert. Den haben wir dann am Ende auch genommen und dafür an anderen Stellen etwas gespart.
Noch kurz zum besseren Verständnis: Ich generiere nicht eine ID aus allen Komponenten des PCs sondern 4-5 IDs aus den Teilkomponenten (HDD, CPU, Mainboard, ...). Solange nur eine dieser Teil-IDs ungültig ist, dann ist der Gesamt-Hash trotzdem noch gültig. So kann man auch mal schnell eine Festplatte oder ähnliches tauschen ohne gleich Nachhause zu telefonieren und das Produkt neu freischalten zu müssen :)

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^