[ASP] RC4 / cookie error

Pagina: 1
Acties:

  • DerKleinePunkt
  • Registratie: November 2004
  • Niet online

DerKleinePunkt

Es gibt keine kleinen Punkte!

Topicstarter
Bij toeval ben ik zojuist wat raars tegen gekomen. Voor een site waar ik aan werk wordt het wachtwoord van de gebruiker middels RC4 encryptie opgeslagen in een cookie. Vervolgens wordt op een andere pagina de gegevens van de gebruiker middels de cookie data gecontrolleerd. Wat schetste mijn verbazing, het wachtwoord was in enkele situaties anders dan dat deze was ingevoerd :?

De RC4 code
code:
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
44
45
46
47
48
49
50
51
function RC4(ByRef pStrMessage, ByRef pStrKey)
    'This file came from Planet-Source-Code.com...the home millions of lines of source code
    dim lBytAsciiAry(255)
    dim lBytKeyAry(255)
    dim lLngIndex
    dim lBytJump
    dim lBytTemp
    dim lBytY
    dim lLngT
    dim lLngX
    dim lLngKeyLength
    
    ' Validate data
    if Len(pStrKey) = 0 then exit function
    if Len(pStrMessage) = 0 then exit function
    ' transfer repeated key to array
    lLngKeyLength = Len(pStrKey)
    for lLngIndex = 0 to 255
        lBytKeyAry(lLngIndex) = Asc(Mid(pStrKey, ((lLngIndex) Mod (lLngKeyLength)) + 1, 1))
    next
    ' Initialize S
    for lLngIndex = 0 to 255
        lBytAsciiAry(lLngIndex) = lLngIndex
    next
    ' Switch values of S arround based off of index and Key value
    lBytJump = 0
    for lLngIndex = 0 to 255
        ' Figure index to switch
        lBytJump = (lBytJump + lBytAsciiAry(lLngIndex) + lBytKeyAry(lLngIndex)) Mod 256
        
        ' Do the switch
        lBytTemp = lBytAsciiAry(lLngIndex)
        lBytAsciiAry(lLngIndex) = lBytAsciiAry(lBytJump)
        lBytAsciiAry(lBytJump)  = lBytTemp
    next
    lLngIndex = 0
    lBytJump = 0
    for lLngX = 1 to Len(pStrMessage)
        lLngIndex = (lLngIndex + 1) Mod 256 ' wrap index
        lBytJump = (lBytJump + lBytAsciiAry(lLngIndex)) Mod 256 ' wrap J+S()  
        ' Add/Wrap those two        
        lLngT = (lBytAsciiAry(lLngIndex) + lBytAsciiAry(lBytJump)) Mod 256   
        ' Switcheroo
        lBytTemp = lBytAsciiAry(lLngIndex)
        lBytAsciiAry(lLngIndex) = lBytAsciiAry(lBytJump)
        lBytAsciiAry(lBytJump)  = lBytTemp
        lBytY = lBytAsciiAry(lLngT)
        ' Character Encryption ...    
        RC4 = RC4 & Chr(Asc(Mid(pStrMessage, lLngX, 1)) Xor lBytY)
    next
end function


Een random wachtwoord waar het fout gaat

code:
1
2
3
4
5
6
7
8
9
 lStrKey = "papierversnipperaar"
 wachtwoord = "tthh4as"
 response.write wachtwoord & "<br>"
 wachtwoord = RC4(wachtwoord, lStrKey)
 response.cookies("wachtwoord") = wachtwoord
 wachtwoord = request.cookies("wachtwoord")
 response.write wachtwoord & "<br>"
 wachtwoord = RC4(wachtwoord, lStrKey)
 response.write wachtwoord & "<br>"


In Firefox heeft dit het volgende resultaat
tthh4as

tt

Hij gaat ergens de mist in bij hh of de key. Als ik het wachtwoord of key wijzig gaat het namelijk wel goed. Ook heb ik gekeken of de cookie uit teveel bytes bestond, maar dit was niet het geval. Mijn volgende gedachte was dat de encryptie karakters oplevert waarmee IE en Firefox niet overweg kunnen. Maar dan zou het toch goed moeten gaan wanneer ik het wachtwoord vergelijk met die uit een database? Ik zie het probleem dus even niet iemand suggesties?

Ein kleiner Punkt in einer grossen Welt


  • Mischa_NL
  • Registratie: Mei 2004
  • Laatst online: 01-02-2023
Ik weet niet wat er fout gaat maar volgens mij kun je dus die cookie wachtwoorden decrypten?!
Altijd een one way hash gebruiken zoals md5 lijkt me!

Wat er fout gaat weet ik niet, sorry.

Verwijderd

Waarschijnlijk komt er in het resultaat een character voor, welke een speciale betekenis heeft in het HTTP protocol (newline bijvoorbeeld). base64 encoding is wat je nodig hebt.

  • DerKleinePunkt
  • Registratie: November 2004
  • Niet online

DerKleinePunkt

Es gibt keine kleinen Punkte!

Topicstarter
Mischa_NL schreef op maandag 25 juli 2005 @ 14:00:
Ik weet niet wat er fout gaat maar volgens mij kun je dus die cookie wachtwoorden decrypten?!
Altijd een one way hash gebruiken zoals md5 lijkt me!

Wat er fout gaat weet ik niet, sorry.
Behalve het wachtwoord worden ook andere gegevens van de gebruiker gechecked m.a.w. ook al weet je het gebruikersnaam en wachtwoord dan kom je er nog niet in. Persoonlijk zou ik liever sessions gebruiken, maar dit is niet mogelijk ivm de session time-out van de provider.

Kleine toevoeging, zoals je zelf al noemt is md5 one way. Maar dit werkt natuurlijk niet in een situatie waarbij men de gebruiker het huidige wachtwoord toe kan sturen via e-mail (let op, wanneer deze niet random gegenereerd wordt, alvorens deze te e-mailen).

[ Voor 19% gewijzigd door DerKleinePunkt op 25-07-2005 15:04 ]

Ein kleiner Punkt in einer grossen Welt