Re: Mein Ver/Entschlüsseln - Eure Meinung
Verfasst: 30.06.2017 10:52
Kein Passwort speichern! Denke bitte an das AES Interface! Beim cracken kann die Schlüsselerzeugung übersprungen werden!
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
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
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
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.BSP hat geschrieben:Frage: Ist es nicht sogar oberwichtig, einen weiteren Schlüssel anzulegen?
Denn sonst kann ich mein Passwort auch gleich direkt speichern.
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))
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.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?
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.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.