Autor Beitrag
Aggrasso
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16
Erhaltene Danke: 1



BeitragVerfasst: Fr 07.06.13 03:56 
Hi ich brauch mal euren Rat,

Ich schreib z.Z zwei Programme ( Eins für den PC und eins für eine Mobiles gerät ) -> Remote App ( Maus , Keyboard und vorher in dem PC Tool eingestellte Programme z.b. VLC, winamp, FireFox... )
Die Geräte sollen nur mit einer PairingID funktionieren.

So wird die PairingID erstellt:

CPU Data auslesen: ( Daten vereändert CPU ID und Hash )

Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz = A1
BEABFBFE108196B5 = A2

B1 = StringToHex(A1)
B2 = StringToHex(A2)

C1 = (Get_DataToMD5Hash(B2) + Get_DataToMD5Hash(B1))
C2 = Get_DataToSHA1Hash(C1)

C2 ( e3a150a5de407c6d445de5262ddf5f332151166d )
C2 -> Reverse
( e3a150a5de407c6d445de5262ddf5f332151166d -> d661151233f5fdd2625ed544d6c704ed5a051a3e )

D1 = C2 ( Ohne Buchstaben )
( d661151233f5fdd2625ed544d6c704ed5a051a3e -> 46115123352625544670450513 )

if ( D1 < 30) { D1 + "0" }
( 66115123352625544670450513 -> 661151233526255446704505130000 )

PairingID = 661151233526255346704505130000


Die PairingID muss man ins Mobiles gerät eingeben, Sie wird immer mit übertragen !
Und so schaut der Daten String aus der zum PC gesendet wird:

z.B.:

@PairingID#MausPos_X#MausPos_Y#Keyboard Taste#ProgrammID#....~

string Str_Data = "@661151233526255346704505130000#141#110#(char)90#ID001#....~"
string Str_DataSend = Get_Rijndael_Encrypt(Str_Data, Str_RijndaelKey);

Auf der PC Seite wird entschlüsselt und als erstes die PairingID überprüft, ist sie richtig wird der sting mit ".Split" zerlegt darum die zeichen "@", "#", und "~".
Und so weiter verarbeitet.
Wenn die PairingID falsch ist, wird eine Error Log Protokoll erstellt ( PairingID, Time, IP des Mobiles gerät ).

Ich weiss noch nicht ob ich TCP oder UDP nehm soll?
Also ich würde tendier zu UDP denn damm muss ich nicht immer eine Feste verbindung aufbauen, denn wenn das Mobiles gerät in den standby modus geht muss ich wieder den Server neu Starten usw...
Und bei UDP kann ich einfach die Daten hin senden.

Wo (abschnitt) und wie könnte ich es eleganter Coden / lösen, oder Passt das so ?

MFG Aggrasso


Moderiert von user profile iconTh69: Topic aus C# - Die Sprache verschoben am Fr 07.06.2013 um 10:19
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 07.06.13 10:06 
Also erstmal: "Die PairingID muss man ins Mobiles gerät eingeben"
Du erwartest also, dass die Benutzer eine 30 Stellige Zahl eingeben? Ist schon etwas overkill ....

Zudem ist dein verfahren jetzt mal "nicht so gut". Erstens hängt das ja echt nur von der CPU ab und zweitens erzeugst du erst ganz viel Zufall um dann wieder Bits wegzuwerfen... Ich würde erstens noch eine Zufallszahl einbauen und zweitens direkt aus dem SHA1 Hash (der ja 160bits hat) nur soviel herausnehmen wie ich brauche.

Du könntest auch den Zufallsgenerator mit den ersten paar Bytes von dem SHA-1 Hash seeden und dann eine passende Zufallszahl generieren :wink:
Aggrasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16
Erhaltene Danke: 1



BeitragVerfasst: Fr 07.06.13 19:46 
@jfheins
Zitat:
Du erwartest also, dass die Benutzer eine 30 Stellige Zahl eingeben?


Das ist ja nur beim 1 mal Verbinden.

Zitat:
Erstens hängt das ja echt nur von der CPU ab und zweitens erzeugst du erst ganz viel Zufall um dann wieder Bits wegzuwerfen

Ja das es vom CPU abhängt ist so gewollt es soll ja nur dann mit diesem PC funzen, denn Wenn man es sonst Koppelt, könnte man ja dann das Programm auf eine andern PC Kopiern.
Und man hätte eine Art Trojaner !

Aber ich hab noch was eingebaut:

........[ PC Seite ]...............................................[ Mobile Seite ]
Ermitlung der PairingID...............................Frei wahl des Mobile Name
( Eintrag des Mobile Namens ).........................( eintrag der PairingID )

<-- Data Send ( PairingID und Mobile Name )
Data Send -> ( PairingID )

Check Auf beide Seiten ( PairingID und Name ) = false { Daten verwerfen }

Zitat:
zweitens erzeugst du erst ganz viel Zufall um dann wieder Bits wegzuwerfen

Ja da ich auf der Mobile Seite nur eine SoftNumped gecodet hab für die eingabe der PairingID ! ( So ist es auch bei Teamviewer ) nur das ich mehr zahlen hab ;)

Zitat:
Du könntest auch den Zufallsgenerator mit den ersten paar Bytes von dem SHA-1 Hash seeden und dann eine passende Zufallszahl generieren

Ja sowas hab ich auch drin als GuestID die hat eine gültigkeit von 12 Stunden bis jetzt, eftl mach ich es auf 23 Stunden.

Ich muss dazu sagen das die "Class_PairingID" eigentlich dafür gedacht war das ein mein alte "Stegano Programm" so mit meine PC zu Koppeln.
Nur hab ich hir die Buchstaben aus der ID entfernt.

Zitat:
Ich würde erstens noch eine Zufallszahl einbauen

Das ist eine Sicherheitslücke denn dann müsste ich die PairingID in einer Datei Speichern, denn bei jeden Programmstart würde ich eine neue Zufallszahl bekommen.


MFG Aggrasso
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 07.06.13 21:33 
Zitat:
Ja das es vom CPU abhängt ist so gewollt es soll ja nur dann mit diesem PC funzen, denn Wenn man es sonst Koppelt, könnte man ja dann das Programm auf eine andern PC Kopiern.
Und man hätte eine Art Trojaner !

Aber es hängt ja NUR von der CPU ab. Da CPU's ja durchaus en masse verkauft werden, könntest du also meinen rechner fernsteuern, nur weil ich die gleiche CPU habe ...?

Zitat:
Das ist eine Sicherheitslücke denn dann müsste ich die PairingID in einer Datei Speichern, denn bei jeden Programmstart würde ich eine neue Zufallszahl bekommen.

Warum ist das eine Sicherheitslücke? Solange der PC sicher ist (wovon du ausgehen musst) ist das gnaze doch sicher.

Mir ist noch nicht ganz klar, was das sein soll. Ist das für einmalige Verbindungen (wie Teamviewer) so dass man an PC ein Kennwort bekommt, das in der App eintippt und solange man das Programm an PC nicht schließt, funktioniert das? Oder soll es eher soweas sein wie Blutooth, wo man zwei Geräte koppelt und die können dann bis auf Widerruf kommunizieren?

Im ersten Fall ist es ja ganz einfach mit einer Zufallszahl getan. Im zweiten Fall ist eine richtige Authentifizierung angebracht. Und ja, dabei müssen beide Seiten ein Geheimnis speichern. Das geht zwar nie über die Leitung, aber der PC kann verifizieren, dass die App das Geheimnis kennt.
Aggrasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16
Erhaltene Danke: 1



BeitragVerfasst: Fr 07.06.13 22:23 
Zitat:
Aber es hängt ja NUR von der CPU ab. Da CPU's ja durchaus en masse verkauft werden, könntest du also meinen rechner fernsteuern, nur weil ich die gleiche CPU habe ...?


Ich glaub ich hab mich da falsch ausgedrückt!

Da die CPU wird on mass verkauft! Aber da ich die CPU Seriennummer mit auslese und die Seriennummer mit den CPU Namen kombiniere ist es einmalig.
Es sei denn man faket die Seriennummer des CPU´s.

So wie es du mir vorschlägst ist es ein wenig unsicher, nur eine ID nummer zu erstellen.
Denn angenommen ich erstell auf meine PC eine Kopplung ( PC Tool und Mobile Teil ) dann schmuggel ich das Programm bei dir ein und Boom ich hätte zugriff auf dein "System", aber nur unter der voraussetzung du hättest auch so ein teil und würdest es nutzen.
Darum will ich jede Kopplung auch an die Hardware des PC anbinden.
Ich könnte ja auch noch die Seriennummer des Mainboards mit einbinden.

Zitat:
Warum ist das eine Sicherheitslücke? Solange der PC sicher ist (wovon du ausgehen musst) ist das gnaze doch sicher.


Nein das muss ich nicht, denn soll im PS-Vita shop rein ;)
Und Freeware kann man es NICHT für die Vita anbieten darum muss ich sehr viel beachten.

Zitat:
das in der App eintippt und solange man das Programm an PC nicht schließt, funktioniert das

Ja so ist es , die verbindung ist über WLan ! Ob UDP oder TCP weiss ich noch nicht.
Es kommt daruf an ob ich auch Sound / Video zu Vita Stream will!

Denn es soll nicht nur als Maus / Keyboard funzen sonder auch als Joypad für Games und was weiss ich.
Denn mann kann auch die Lagesensoren und die Beschleunigungssensoren nutzen !

Zitat:
Im zweiten Fall ist eine richtige Authentifizierung angebracht

Ja das weiss dafür ist die "PairingID" und das ganze wird ja auch noch verschlüsselt mit dem Rijndael-Algorithmus mit ( "Rolling Key System" ) !

Ich hab das als Simuliert in VM-Ware bis jetzt konnte ich die "PairingID" noch nicht faken ! ( Unter verwendung von Virtuellen CPU´s )

oder wie würdet du ein "richtige Authentifizierung" duchführen ?

MFG Aggrasso
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 07.06.13 23:14 
Hi,
woher bekommst du diese Seriennummer?
Soweit ich weiß haben aktuelle CPUs keine weltweit eindeutige Nummer. Das Mainboard auch nicht immer. Bei der Festplatte könntest du Glück haben, und falls eine Netzwerkkarte drin ist ahebn die eine eindeutige MAC-Adresse.

Und deine Pairing-ID sollte eigentlich auf keinen Fall konstant sein. Stell dir vor, du pairst deine PSPvita und jemand macht hinter dir ein Foto mit dem 30stelligen Code. (Man braucht ja doch einige Zeit, das einzutippen)

Wenn der Code konstant ist, kann er sich einfach auch so ein Teil kaufen und deinen PC steuern!

Ich denke das eher so:
1. Man startet das Programm am PC.
2. Man führt die App aus und wählt den PC den man steuern möchte.
3. Der PC erzeugt daraufhin ein secret, das angezeigt wird (12 Ziffern würde ich vorschlagen) und eine challenge "sc" (zufällig, darf länger sein) die verschickt wird.
4. Man gibt diese Ziffernfolge in das Gerät ein.
6. Es wird sha1(sc + secret) zurück geschickt und das secret gespeichert.
7. Der PC kann jetzt nachprüfen, dass der Client das korrekte secret erhalten hat. Die App ist somit berechtigt, den PC zu steuern.

Das secret muss nur einmalig ausgetauscht werden. Danach kann der PC einfach immer eine challenge verschicken und der Client antwortet entsprechend. Solange der Kommunikationskanal besteht, ist die App authentifiziert. Möchtest du UDP benutzen, musst du das irgendwie in jedes Paket integrieren. Also z.B. immer x und sha1(x + secret) mitschicken. Der PC kann dann bei jedem Paket prüfen, dass der Client das secret kennt.

Und am PC kannst du dann auch die secrets verwalten und einzelne Clients wieder aussperren ;-)
Aggrasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16
Erhaltene Danke: 1



BeitragVerfasst: Sa 08.06.13 03:23 
Zitat:
woher bekommst du diese Seriennummer?


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
        static string[] M_Str_Arry_ProcessorData = new string[2];
        public static void Get_ProcessorData()
        {
            ManagementClass MC_Processor = new ManagementClass("Win32_Processor");
            ManagementObjectCollection MOC_Processor = MC_Processor.GetInstances();
            try
            {
                foreach (ManagementObject MO_Processor in MOC_Processor)
                {
                    M_Str_Arry_ProcessorData[0] = MO_Processor.Properties["Name"].Value.ToString();  // Bei Mir -> Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
                    M_Str_Arry_ProcessorData[1] = MO_Processor.Properties["ProcessorId"].Value.ToString(); // BEABFBFE108196B5 ( Abgeändert )
                    break;
                }
            }
            catch (Exception Exception_Data)
            { M_Str_Exception = Exception_Data.ToString(); }
        }


Win32_Processor class:
Und hir gibt es noch mehr -> msdn.microsoft.com/e...73%28v=vs.85%29.aspx
Aber nicht alle geben eine Wet zurück ! Da kommt es auf den Treiber an soweit ich weiss !

Mann kann fast jeder Hardware auslesen !.

Zitat:
Wenn der Code konstant ist, kann er sich einfach auch so ein Teil kaufen und deinen PC steuern!

Dann muss er nur noch wissen wie die ID von der Vita ist !
Aber danke du hast mir eine Idee gebracht :)

Edit:

Und ich lese jetzt auch das Bios aus!

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
 public static void Get_BIOSData()
        {
            ManagementClass MC_BIOS = new ManagementClass("Win32_BIOS");
            ManagementObjectCollection MOC_BIOS = MC_BIOS.GetInstances();
            try
            {
                foreach (ManagementObject MO_BIOS in MOC_BIOS)
                {
                    M_Str_Arry_BIOSData[0] = MO_BIOS.Properties["Manufacturer"].Value.ToString();
                    M_Str_Arry_BIOSData[1] = MO_BIOS.Properties["SerialNumber"].Value.ToString();
                    M_Str_Arry_BIOSData[2] = MO_BIOS.Properties["SMBIOSBIOSVersion"].Value.ToString();
                    break;
                }
            }
            catch (Exception Exception_Data)
            { M_Str_Exception_Data = Exception_Data.ToString(); }
        }



Ich hab es mit ( Public PairingID & Hidden PairingID ) gemacht und das mit "RollingID"

PS: M_int_Arry_RollingID wird verändert und es kommt noch was hinzu ;)

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
 static int[,] M_int_Arry_RollingID = new[,] 
        {
            { 681372805156887564578266371575 },
            { 858727221372678740523545275146 },
            { 410134684550723225175501034165 },
            { 352713151802113337367247425170 },
            { 636330212047310316850184074170 }, 
            { 674122685087024363670471243235 }, 
            { 513135328761175106061038810386 }, 
            { 835837477703480738404515456411 }, 
            { 582173514761725644717078222847 }, 
            { 005620020622463378870260351385 },
            { 065565418551308541584286773536 }, 
            { 863464588676831785160870166778 },
            { 286268783385270734487645587238 }, 
            { 670038856280267468823127053166 },
            { 787826230423031221551703462447 }, 
            { 580744110366764478764752088445 }, 
            { 478283327610017382788266372664 }, 
            { 456488757015005363458665511170 },
            { 154214352753366225181710578086 }, 
            { 756785168001150528728408823362 } 
        };

        public static string Get_PairingID(int int_RollingID, int int_RollingIDPos)
        {
            string[] Str_Arry_Temp = new string[4];
            int[] int_Arry_KeyLenght = new int[2];
            char char_Scann;
            Str_Arry_Temp[0] = Get_StringReverse(Get_Hashing());
            for (int int_Scann = 0; int_Scann < 30; int_Scann++) 
            {
                char_Scann = Convert.ToChar(Str_Arry_Temp[0].Substring(int_Scann, 1));
                if (Char.IsNumber(char_Scann) == true)
                { Str_Arry_Temp[1] = Str_Arry_Temp[1] + char_Scann.ToString(); }
            }
            for (int int_KeyAt = 0; int_KeyAt < 30; int_KeyAt++)
            { if (Str_Arry_Temp[1].Length < 30) { Str_Arry_Temp[1] = Str_Arry_Temp[1] + M_int_Arry_RollingID[int_RollingID, int_KeyAt + int_RollingIDPos].ToString(); } }
            Str_Arry_Temp[2] = Str_Arry_Temp[1].Substring(010);   // Public PairingID
            Str_Arry_Temp[3] = Str_Arry_Temp[1].Substring(1020);  // Hidden PairingID
                 // M_Str_Test = Str_Arry_Temp[3];
            return Str_Arry_Temp[2];
        }



MFG Aggrasso
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Sa 08.06.13 08:53 
Nochmal zu der CPUID: Die ist wirklich nicht eindeutig, das sind nur Flags die aussagen was die CPU alles kann. Hat jemand den gleichen Prozessor, hat er auch die gleiche CPUID.

Zitat:
Dann muss er nur noch wissen wie die ID von der Vita ist !

Und zu deinem Vorhaben: gehe ich recht in der Annahme dass der Str_RijndaelKey in der Anwendung fest eingebaut ist? Wenn man dann nämlich im WLAN drin ist, kann man einfach die Kommunikation mitlesen und hat direkt beide Keys.

Was du da anstellst dieht einfach sehr nach Security-by-Obscurity aus, und eben nicht nach richtiger Sicherheit. Der Str_RijndaelKey wäre doch ein geeigneter Kandidat zum Eintippen auf der PSP! Aber auch sa sollte natürlich jeder PC für jede Fernsteuerung einen neuen, zufälligen, Schlüssel generieren.

P.S.: Überlege mal wie das bei Laptops ist: Die Mainboard-Seriennummer verändert sich da u.U. durch eine Dockingstation. Zudem werden die Teile in großen Stüclzahlen mit den gleichen Komponenten hergestellt...
Aggrasso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16
Erhaltene Danke: 1



BeitragVerfasst: Sa 08.06.13 19:15 
Zitat:
Nochmal zu der CPUID: Die ist wirklich nicht eindeutig, das sind nur Flags die aussagen was die CPU alles kann. Hat jemand den gleichen Prozessor, hat er auch die gleiche CPUID.

Ja OK Punkt an dich ;) Du hast recht !

Zitat:
Überlege mal wie das bei Laptops ist: Die Mainboard-Seriennummer verändert sich da u.U. durch eine Dockingstation. Zudem werden die Teile in großen Stüclzahlen mit den gleichen Komponenten hergestellt

Ja das kann sein, ist aber zZ egal da ich die ( "Win32_BIOS" -> SerialNumber ) aus lese und die ist wirlich einmalig.
Und kann nicht geändert werden und das Bios neu flashen brint bei den neuen Bios Bausteinen nichts, denn die ist im ROM drin und nicht mehr im EEprom.
Bei alten Bios würde es aber noch gehn. So wie man bei alten Handys die IMEI nummer ändern kann ( 3310 usw... )
Da ich noch nicht weis wie man die Mainboard daten lesen kann. :(

Zitat:
Security-by-Obscurity aus, und eben nicht nach richtiger Sicherheit

Ich muss ja eine ID erstellen können die auf einen PC Reproduzierbar ist. Da mach ich mit der ID.
Die verschlüsselung kommt zum schluss. Es schaut nur so aus weil ich die ID Tricky erstell. :)

Zitat:
Und zu deinem Vorhaben: gehe ich recht in der Annahme dass der Str_RijndaelKey in der Anwendung fest eingebaut ist?


Denn Erste Teil von "Rijndael" stell ich nicht Online da da der IV drin ist. Aber ich muss erst mal schaun on es so OHNE[*1] fehler mit Rijndael funzt da ja Rijndael ( Blockverschlüsselung ) ist.
Und ob ich nicht mit einer die auf ( Stromverschlüsselung ) setzt besser dran bin.
Für RijndaelKey verwende ich das: ( PS das ist nicht von mir und cih weiss leider nicht mehr wo ich den her hab ich hab es nur modifiziert "using" eingebaut denn das war da nicht drin)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 private static byte[] Rijndael_Encrypt(byte[] byte_Arry_DataClear, byte[] byte_Arry_Rijndael_Key, byte[] byte_Arry_Rijndael_IV)
        {
            MemoryStream MemoryStream_Daten = new MemoryStream();
            Rijndael Rijndael_Algo = Rijndael.Create();
            Rijndael_Algo.Key = byte_Arry_Rijndael_Key;
            Rijndael_Algo.IV = byte_Arry_Rijndael_IV;
            using (CryptoStream CryptoStream_Data = new CryptoStream(MemoryStream_Daten, Rijndael_Algo.CreateEncryptor(), CryptoStreamMode.Write))
            {
                CryptoStream_Data.Write(byte_Arry_DataClear, 0, byte_Arry_DataClear.Length);
                CryptoStream_Data.Close();
            }
            byte[] byte_Arry_EncryptedData = MemoryStream_Daten.ToArray();
            return byte_Arry_EncryptedData;
        }


Zitat:
Aber auch sa sollte natürlich jeder PC für jede Fernsteuerung einen neuen, zufälligen, Schlüssel generieren.

Ich mach das so, dass jeder sein Usernamen und PW selber wählen kann. Und die Logindaten wird dann als "Shadow file" abgelegt.

Ach ja und zum schluss wenn das Tool fertig ist lass ich noch -> Security-by-Obscurity Tool Drüberrutschen.

Edit:
Ich hab jetzt noch eine Stufe eingebaut ich berechne die "PairingID" jetzt auch aus dem User / PC namen.


MFG Aggrasso