Mein Ver/Entschlüsseln - Eure Meinung

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TroaX
Beiträge: 660
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Mein Ver/Entschlüsseln - Eure Meinung

Beitrag von TroaX »

Kein Passwort speichern! Denke bitte an das AES Interface! Beim cracken kann die Schlüsselerzeugung übersprungen werden!
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Mein Ver/Entschlüsseln - Eure Meinung

Beitrag von NicTheQuick »

Ein bisschen muss ich widersprechen. Den Hash des Passworts kann man schon speichern, aber nur, wenn es lange genug dauert den Hash zu generieren (Stichwort "Runden") und am besten auch nur mit Salt.
Wenn es darauf hinausläuft, dass man mit dem Passwort weitere Dinge verschlüsselt, dann muss man den Hash nicht speichern, da man das entschlüsselte Ergebnis verifizieren kann, aber sonst tut das jede anständige Webseite genau so.
Bild
Benutzeravatar
TroaX
Beiträge: 660
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Mein Ver/Entschlüsseln - Eure Meinung

Beitrag von TroaX »

Bitte jetzt nichts durcheinander bringen. In Fällen, wo nur ein Hash mit dem dazugehörigen Passwort gegengeprüft werden soll, ist das Speichern unausweichlich. Bei einem Einsatz wie diesem dient es aber als Schlüssel für die Verschlüsselung. Und da darf man das definitiv nicht, da jede noch so kryptografisch sichere Routine zur Schlüsselerzeugung obsolet wird.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
BSP
Beiträge: 188
Registriert: 01.02.2009 14:04

Re: Mein Ver/Entschlüsseln - Eure Meinung

Beitrag von BSP »

Hallo Allerseits.

Frage: Ist es nicht sogar oberwichtig, einen weiteren Schlüssel anzulegen?
Denn sonst kann ich mein Passwort auch gleich direkt speichern.

Der Eindringling braucht sonst doch nur eine Befehlszeile, um mein Prg zu starten.
Er nimmt ein eigenes Passwort, erzeugt daraus den SHA3- Code,
(SHA3$ = StringFingerprint(Sein eigenes Passwort, #PB_Cipher_SHA3, 512)
trägt sich dieses SHA3- Wort in die Datei ein, in der mein SHA- Code liegt
und startet das Prg. Nun mit seinem Passwort.
Auch ein mehrfaches nachvercoden des codes bringt so nichts mehr.

Code: Alles auswählen

For i = 1 To Len(pw$)*Len(pw$)
  SHA3a$ = StringFingerprint(SHA3a$, #PB_Cipher_SHA3, 512)
  ;Debug SHA3a$ ; Wird so auf Laufwerk gespeichert
Next
Die Frage ist doch viel mehr, wie wird ein Schlüssel mit dem Passwort verschmolzen?
Beispiel:

Code: Alles auswählen

Procedure.s erzeuge_schluessel(passwort$, matrix$)
  For i = 1 To Len(passwort$)
    a1 = i : a2 = i + 1
    If a2 > Len(passwort$) : a2 - Len(passwort$) : EndIf
    x = Asc(Mid(passwort$, a1, 1))
    y = Asc(Mid(passwort$, a2, 1))
    pw$ + Mid(matrix$, x, 1) + Mid(matrix$, y, 1)
  Next
  
  pw$ = pw$ + passwort$ + pw$
  ; Könnte man noch mehr verbiegen
  ProcedureReturn pw$
EndProcedure
Oder sehe ich da wieder was falsch?

Gruß: Bernd
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Mein Ver/Entschlüsseln - Eure Meinung

Beitrag von ts-soft »

BSP hat geschrieben:Frage: Ist es nicht sogar oberwichtig, einen weiteren Schlüssel anzulegen?
Denn sonst kann ich mein Passwort auch gleich direkt speichern.
Wozu? Dein Passwort wird doch nirgends gespeichert, sondern nur der Hashwert, der sich nicht umkehren läßt. Der Hashwert dient nur der Überprüfung auf Richtigkeit des Passwortes, das nirgends gespeichert ist. So läßt sich, bei richtigem Passwort, alles fehlerfrei wieder entschlüsseln und nur dann.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
BSP
Beiträge: 188
Registriert: 01.02.2009 14:04

Re: Mein Ver/Entschlüsseln - Eure Meinung

Beitrag von BSP »

Hallo ts-soft.

Ja, aber was wenn der Eindringling sich ein eigenes Passwort nimmt,
den zum Hashwert umwandelt, den Hashwert an meiner Stelle in die Datei einträgt?
Dann findet mein Prg doch seinen Hashwert, zu dem sogar nur er das Passwort kennt.
Oder?

Gruß: Bernd
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
man-in-black
Beiträge: 362
Registriert: 21.08.2006 17:39

Re: Mein Ver/Entschlüsseln - Eure Meinung

Beitrag von man-in-black »

auch wenn der Hash so umgangen wird, muss mit dem PW trotzdem noch die Entschlüsselung erfolgen.
Der Hash soll nur verhindern, dass man in 90% der Fälle umsonst mit der Entschlüsselung beginnt, wenn das PW
nicht stimmt.

Er macht die Datei maximal unbrauchbar für alle.

MFG
MIB
(hab alles, kann alles, weiß alles!!^^)

Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Mein Ver/Entschlüsseln - Eure Meinung

Beitrag von GPI »

@men-in-black
Das ist genau der Gag - wenn das Passwort nicht stimmt *SOLL* man ewig zum überprüfen benötigen. Dadurch wird es erst sicher. Wenn ich schnell das Passwort überprüfen kann, dann hab ich keinerlei Sicherheit.

Mir war langweilig, ich hab mal ein Grundgerüst ohne Interface gebastelt:

Code: Alles auswählen

;todo counter variable!

EnableExplicit
UseSHA3Fingerprint()

#id=$1234567887654321
#SaltByte=32
#KeyBits=256
#KeyByte=#KeyBits/8
#IVCount=10

Structure RndData
  byte.a[32]
EndStructure

Structure Password
  Title.s
  User.s
  Password.s
  RndData.RndData
EndStructure

Structure json
  List passwords.password()
EndStructure

Structure iv
  byte.a[16]
EndStructure

Structure CryptFileHeader
  id.q  
  count.l
  salt.a[#SaltByte]
  iv.iv[#IVCount]
  ;json.b[0]
EndStructure

Structure Cryptkey
  byte.a[#KeyByte]
EndStructure


Global MasterPassword.s
Global FileHeader.CryptFileHeader
Global CryptKey.CryptKey
Global jsonStruct.json

Procedure StrToByte(str.s,*out,byte)
  Protected i
  For i=0 To byte-1
    PokeA(*out, Val("$" + Mid(str,i*2+1,2)) )
    *out+1
  Next
EndProcedure

Procedure CreateCryptKey()
  Protected *buffer
  Protected *write
  Protected size,fp
  Protected hash.s
  Protected i
  
  size=StringByteLength(MasterPassword,#PB_UTF8)+#SaltByte
  *buffer=AllocateMemory(size)
  If *buffer=0
    ProcedureReturn #False
  EndIf
  
  *write=*buffer+PokeS(*buffer,MasterPassword,-1,#PB_String_NoZero|#PB_UTF8)
  CopyMemory(@FileHeader\salt,*write,#SaltByte)
  
  fp=StartFingerprint(#PB_Any,#PB_Cipher_SHA3,#KeyBits)
  AddFingerprintBuffer(fp,*buffer,size)
  hash.s=FinishFingerprint(fp)
  
  StrToByte(hash,@CryptKey,#KeyByte)
  
  For i=0 To FileHeader\count
    fp=StartFingerprint(#PB_Any,#PB_Cipher_SHA3,#KeyBits)
    AddFingerprintBuffer(fp,CryptKey,#KeyByte)
    hash.s=FinishFingerprint(fp)
    StrToByte(hash,@CryptKey,#KeyByte)
  Next
  
  Debug "MasterPassword:"+MasterPassword
  Debug "Key:"+hash
  FreeMemory(*buffer)
  ProcedureReturn #True
EndProcedure

Procedure SaveCrypt(file.s)
  Protected out,js
  Protected size,*buffer,*out
  Protected ivnb
  Protected ret
  
  FileHeader\id=#id
  FileHeader\count= CryptRandom(899999)+100000
  CryptRandomData(@FileHeader\salt,#SaltByte)
  CryptRandomData(@FileHeader\iv,SizeOf(iv)*#IVCount)
  
  CreateCryptKey()
  
  Repeat
    out=CreateFile(#PB_Any,file)
    If out=0
      Break
    EndIf
   
    js=CreateJSON(#PB_Any)
    If js=0
      Break
    EndIf
    InsertJSONStructure( JSONValue(js), @jsonStruct, json)
    
    size=ExportJSONSize(js)
    If size<16:size=16:EndIf
    
    *buffer=AllocateMemory(size*2)
    *out=*buffer+size
    If *buffer=0
      Break
    EndIf
    
    ivnb=CryptRandom(9)
    Debug "useIV:"+ivnb
    If ExportJSON(js,*buffer,size)=0
      Break
    EndIf
    
    If AESEncoder(*buffer,*out,size,@CryptKey,#KeyBits,@FileHeader\iv[ivnb])=0
      Break
    EndIf
    
    Debug ComposeJSON(js)
   
    Debug "Header:"+SizeOf(cryptFileHeader)
    WriteData(out,FileHeader,SizeOf(CryptFileHeader))
    Debug "AES-Data:"+size
    WriteData(out,*out,size)
    
    ret=#True
  Until #True
  
  If out
    CloseFile(out):out=0
  EndIf
  If *buffer
    FreeMemory(*buffer):*buffer=0
  EndIf
  If js
    FreeJSON(js):js=0
  EndIf
  Debug "SaveCrypt:"+ret
  ProcedureReturn ret
EndProcedure
Procedure LoadCrypt(file.s)
  Protected in
  Protected size
  Protected ret=#False
  Protected *buffer
  Protected *out
  Protected js
  Protected ivnb
  Repeat
    in=ReadFile(#PB_Any,file)
    If in=0:Break:EndIf
    
    size=Lof(in)
    If size<=SizeOf(CryptFileHeader): Break :EndIf
    size-SizeOf(CryptFileHeader)
    
    ReadData(in,@FileHeader,SizeOf(CryptFileHeader))
    If FileHeader\id<>#id:Break:EndIf
    
    *buffer=AllocateMemory(size*2)
    *out=*buffer+size
    If *buffer=0:Break:EndIf
    
    ReadData(in,*buffer,size)
    
    CreateCryptKey()
    
    For ivnb=0 To 9
      Debug "Test iv "+ivnb
      If AESDecoder(*buffer,*out,size,@CryptKey, #KeyBits,@FileHeader\iv[ivnb])
        js=CatchJSON(#PB_Any,*out,size)
        If js
          Break
        EndIf
      EndIf
    Next
    If js=0:Break:EndIf
    
    Debug ComposeJSON(js)
    
    ExtractJSONStructure(JSONValue(js), @jsonStruct, json)

    ret=#True
    
  Until #True
  
  If in
    CloseFile(in):in=0
  EndIf
  If *buffer
    FreeMemory(*buffer):*buffer=0
  EndIf
  If js
    FreeJSON(js):js=0
  EndIf
  
  
  Debug "LoadCrypt"+ret
  ProcedureReturn ret
EndProcedure

  

;-init
If OpenCryptRandom()=#False
  Debug "Crypt-Error"
  End
EndIf

Define timer=ElapsedMilliseconds()


;-userinput!
MasterPassword="irgendwasWirresZumTestä89"


;Simulate passwordinput
Debug "******** Add Passwords"
AddElement( jsonStruct\passwords())
jsonStruct\passwords()\Title="HomePage1"
jsonStruct\passwords()\user="Igel"
jsonStruct\passwords()\password="Password1"

AddElement( jsonStruct\passwords())
jsonStruct\passwords()\Title="HomePage2"
jsonStruct\passwords()\user="Maus"
jsonStruct\passwords()\password="Password2"

AddElement( jsonStruct\passwords())
jsonStruct\passwords()\Title="HomePage3"
jsonStruct\passwords()\user="Hügel"
jsonStruct\passwords()\password="Password3"

;Add Randomvalues
ForEach jsonStruct\passwords()
  RandomData(jsonStruct\passwords()\RndData,SizeOf(RndData))
Next

;savefile
Debug "******** Save"
SaveCrypt("demo.passwords")

;wir schreiben sinnlose daten
Debug "******** Clear"
FillMemory(FileHeader,SizeOf(CryptFileHeader))
FillMemory(CryptKey,SizeOf(CryptKey))
FreeList(jsonStruct\passwords())

;loadfile
Debug "******** load"
LoadCrypt("demo.passwords")

Debug "******** output"
ForEach jsonStruct\passwords()
  Debug jsonStruct\passwords()\Title
  Debug "  "+jsonStruct\passwords()\user
  Debug "  "+jsonStruct\passwords()\password
Next

MessageRequester("Test", " time:"+Str(ElapsedMilliseconds()-timer))

Ohne Debugger dauert das ganze Program (ohne ausgabe übrigens) um die 8s (I7 hier), weil dreimal ein Key berechnet wird.
Zuletzt geändert von GPI am 01.07.2017 08:51, insgesamt 1-mal geändert.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
BSP
Beiträge: 188
Registriert: 01.02.2009 14:04

Re: Mein Ver/Entschlüsseln - Eure Meinung

Beitrag von BSP »

Hallo men in black.

Ok, verstehe. Hatte wohl das berüchtigte Brett vorm Kopf.
Meine Daten liegen ja nicht im Klartext in meinem Speicher, (Dateien, Variablen),
sondern ebenfalls mit meinem Passwort verbunden verschlüsselt.
Startet mein Prg nun mit einem fremden Passwort, wird nur Datenmüll erzeugt.

Ok. Weitere fragen werden sicher noch folgen.

Also Gruß & Dank an Alle.
Bernd

Ps. Hallo GPI.
Du warst etwas schneller, ich war noch am schreiben.
Ich werde mir Dein Prg noch anschauen.
Danke auch an Dich schon mal.
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
TroaX
Beiträge: 660
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Mein Ver/Entschlüsseln - Eure Meinung

Beitrag von TroaX »

@BSP: Du scheinst meinen Beitrag irgendwie nicht richtig gelesen zu haben, oder?

Das Passwort wird weder als Hash und vor allem erst recht nicht in Klartext gespeichert. Da gibt es auch keinen Grund für. Die Verschlüsselung ist Grundsätzlich dann sicher, wenn der Schlüssel für die Ver-/Entschlüsselung nicht gespeichert wird. Der Nutzer muss diesen also immer bei Programmstart eingeben. Ob das Passwort korrekt ist oder nicht wird geprüft, indem die entschlüsselten Daten auf Validität geprüft werden. Daten invalide = Passwort falsch! Es spricht nichts dagegen, die Daten auf Validität zu prüfen, anstatt einen zwei Hashwerte zu vergleichen. Und wenn du (wie ich es auch schon geschrieben habe) ein strukturiertes Format nimmst, für das PB auch einen Parser hat (XML oder JSON), sagt dir dessen Parser, ob die Daten valide sind oder nicht.

Das ist der Natur geschuldet, das die Erzeugung eines Schlüssels absolut unabhängig von der Verschlüsselung selbst vorgenommen werden. Liegen in dem Programm oder in den dafür vorgesehenen Files alle Daten vor, die zum entschlüsseln der Daten benötigt werden, können die Daten von dritten entschlüsselt werden, ohne das Passwort zu kennen!

Per Reverse-Engineering ist es möglich, die Routinen nachzuvollziehen, die die Schlüssel und Vektoren aus diesen Daten extrahieren. Der Angreifer kann in jeder Programmiersprache sich dann Routinen schreiben, die automatisch diese Daten zusammentragen und dann mit dem AES-256 die Daten entschlüsseln. Die AES-Algorithmen sind spezifizierte Standards und liefern bei identischen Schlüsseln und Vektoren identische Ergebnisse. Genauso ist es mit MD5, SHA1, SHA2, SHA3 oder Blowfisch. All diese Algorithmen sind spezifizierte Standards. Ein Angreifer will an die Daten. Und da geht er den Weg des geringsten Widerstandes und der wäre nun einmal, mit gespeicherten Daten, die er aus den Dateien ermitteln kann, direkt an den Algorithmus zu gehen. Denn dieser wird zwar von deinem Programm verwendet. Aber die verschlüsselten Daten sowie die Verschlüsselungsmethode sind von deinem Programm vollkommen unabhängig! Das Passwort interessiert nicht, wenn er beim Reverse-Engineering feststellt, das er den Schlüssel auch direkt aus gespeicherten Daten extrahieren kann. Und das wäre effizient möglich. Das Cracken eines Hashes nicht! Wenn du also den Schlüssel nicht speicherst, wird der Angreifer feststellen, das er eine völlig unbekannte Variable cracken muss. Und es bleibt zu bezweifeln, das er das versuchen wird.

Also nochmal auf den Punkt: Du musst das Passwort (auch als Hash) nicht speichern und ich rate davon auch dringlichst ab!

PS: Ein unsicheres Passwort betrifft eine Person. Beim speichern von Schlüsseln und gehashten Passwörtern hingegen könntest du alle Nutzer dieses Programms kompromittieren. Nehmt dieses Thema nicht auf die leichte Schulter!
Ja, aber was wenn der Eindringling sich ein eigenes Passwort nimmt,
den zum Hashwert umwandelt, den Hashwert an meiner Stelle in die Datei einträgt?
Dann findet mein Prg doch seinen Hashwert, zu dem sogar nur er das Passwort kennt.
Oder?
Das würde nur gehen, wenn der Schlüssel für die Verschlüsselung unabhängig vom Passwort wäre. Und dann haste ein größeres Problem. Weil dann haste irgendwo bereits den Schlüssel für die Verschlüsselung gespeichert. Das ist da fatalste von allen.
auch wenn der Hash so umgangen wird, muss mit dem PW trotzdem noch die Entschlüsselung erfolgen.
Der Hash soll nur verhindern, dass man in 90% der Fälle umsonst mit der Entschlüsselung beginnt, wenn das PW
nicht stimmt.
Und genau das ist ein fataler Trugschluss. Der Entschlüsselungsversuch dauert deutlich länger als das Hashen eines Passwortes. Was würdest du als Angreifer eher versuchen? Die Verschlüsselung cracken und 1.000 Versuche die Minute schaffen oder den Hash cracken und 100.000 Versuche die Sekunde schaffen? Und wer das Passwort über den Passwordhash gecracked bekommt, kann über das Tool dann auch die Daten entschlüsseln. Du hast also beim Versuch, Rechenzeit durch den Wegfall von Fehlentschlüsselung zu sparen, dem Programm eine Sicherheitslücke verpasst.

EDIT: Da haben sich ein paar Beiträge zwischengeschoben :mrgreen:
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Antworten