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
Een random wachtwoord waar het fout gaat
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?
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