Tänk om jag vore en kryptografisk hash

Kom att tänka på Matte Matik… Tänk om man vore en skalärprodukt.

Men tänk om man vore en kryptografisk hash?
Om nu klienthashning is the shit, hur borde man nu göra?
HTTP Digest Access Authentication är ju bland de erkänt bästa klienthashningsprotokollen. Ganska effektivt, enkelt och snabbt. Är det grymmast som går att göra? Eller är eksBlowfish the shit?
Jag skulle börja med att definera upp vilka salter som jag vill ha;
N1 = Stored server nounce
N2 = Temporal session server nounce
N3 = Client temporal nounce
Därefter vilka övriga variabler jag vill ha:
K1 = Cost factor (stored)
K2 = Cost factor (temporal)
U = Username
P = Password
Och vilka hashar jag vill skapa
H1 = Inner hash (possibly stored on server)
H2 = Outer hash (Temporal)
Nätverksprotokollet för Client och Server blir typ:
C: User U wanna login. Gimme N1, N2, K.
S: (generates K)
SN1N2K.
C: (generates N2)
C: (calculates H1)
C: (calculates H2)
C: H2
S: Ok/Failed
… denotes variable arguments to be concatenated (e.g. (…) = (a, b, c) = abc)
d#k denotes multiple appending, e.g. abc#0 = abc, abc#2 = abcabcabc
h denotes the message digest algorithm, e.g. MD5, SHA-1, SHA-2, SHA-3 etc…
H(k,d…) = h( (d…)#k )
Så definierar vi hasharna så att saltad serverside
H1 = H(K1, U, P, N1)
H2 = H(K2, H1, N2, N3)
Det torde vara hyffsat säkert och tämligen beräkningseffektivt.
Fotnot: h( (d…)#k ) blir i implementation ungefär:
for( dv : d ) sb.append(d);
str = sb.toString();
md.update( str )
for( i = 0; i < k; i++) md.update(str);
return md.digest();

WTF: Publik sida med multipla klient hashningar?!?

Följde en tryckt länk som givet sammanhanget verkade vara en publik sida (varför annars skriva ut den på tidningarna man delar ut till alla?)

Till min förvåning så kom jag till någon konstig sida där det stod att jag behövde slå på JavaScript för att kunna redigera sidan. Tänkte till min förvåning att det måste vara inkompabilitet med min browser, men gissa min förvåning när jag fick se java-källkoden!
<form name=”login” action=”?id=203″ method=”post” onSubmit=”return doChallengeResponse()”>
<input autocomplete=”off” type=”text” name=”username”/>
<input autocomplete=”off” type=”password” name=”password”/>
<input type=”hidden” name=”challenge” value=”269e19032e9bb379f358903b6f383ba6″ />
<input type=”hidden” name=”response”  value=”” />
</form>
<form name=”logintrue” action=”….” method=post>
<input type=”hidden” name=”username” value=””>
<input type=”hidden” name=”challenge” value=”269e19032e9bb379f358903b6f383ba6″>
<input type=”hidden” name=”response”  value=””>
<input type=”hidden” name=”red”  value=””>
</form>
function doChallengeResponse() {
if(document.login.username.value == document.login.password.value){
document.login.password.value =document.login.username.value;
document.login.username.value = ‘block_me’;
document.login.submit();
return false;
}
str = document.login.username.value + ”:” +
MD5(MD5(document.login.password.value) + ”:” + document.login.username.value) + ”:” +
document.login.challenge.value;
document.login.response.value = MD5(str);
document.login.password.value = ””;
document.logintrue.username.value = document.login.username.value;
document.logintrue.response.value = MD5(str);
document.logintrue.submit();
return false;
}
<form name=”login” action=”….” method=”post” onSubmit=”return doChallengeResponse()”>
<input autocomplete=”off” type=”text” name=”username”/>
<input autocomplete=”off” type=”password” name=”password”/>
<input type=”hidden” name=”challenge” value=”269e19032e9bb379f358903b6f383ba6″ />
<input type=”hidden” name=”response”  value=”” />
</form>
<form name=”logintrue” action=”….” method=post>
<input type=”hidden” name=”username” value=””>
<input type=”hidden” name=”challenge” value=”269e19032e9bb379f358903b6f383ba6″>
<input type=”hidden” name=”response”  value=””>
<input type=”hidden” name=”red”  value=””>
</form>
function doChallengeResponse() {
if(document.login.username.value == document.login.password.value){
document.login.password.value =document.login.username.value;
document.login.username.value = ‘block_me’;
document.login.submit();
return false;
}
str = document.login.username.value + ”:” +
MD5(MD5(document.login.password.value) + ”:” + document.login.username.value) + ”:” +
document.login.challenge.value;
document.login.response.value = MD5(str);
document.login.password.value = ””;
document.logintrue.username.value = document.login.username.value;
document.logintrue.response.value = MD5(str);
document.logintrue.submit();
return false;
}
…så man kan sluta sig till att man försökt bygga fort knox runt en publik URL.
Noteringar:
  • Algoritmen gör trippel hashning av lösenordet; H1=MD5(password)
  • Algoritmen gör dubbel hashning av username; H2=MD5(H1,username)
  • Algoritmen gör enkel hashning med salt; H3=MD5(username,H2,challenge)
  • Algoritmen verkar inte tillåta saltad lagring; endast challenge som inte är user-specifik ingår i H3.
  • Algoritmen verkar låsa mot username flerfaldigt (först internt nere i H2 blir H3-hashen user-specifik, sen även explicit ute i H3).
  • Har någon gått beserk här; varför vill man nyckla en hash mot username flerfaldigt?
  • Implementationen kör MD5 en gång mer än vad algoritmen kräver (H3 räknas ut två gånger)
  • Någon verkar ha byggt en rätt extrem grunka här, med otydliga designmål. Själv så anser jag att serverside hashning är viktigare nätverkskryptering (…det kan ju lösas med enkel SSL), så i min smak har man lagt krutet på att lösa fel problem.
  • Varför nycklar man med avseende på username, och varför flerfaldigt? Det verkar lite flummigt. Dock så tror jag det kan vara en fuling – man använder egentligen username som ett salt.
  • På det hela taget: inte min kopp av te, inte helt snyggt, och lite väl mycket CPU-cykler. Men det lär vara tämligen säkert, eftersom denna lök av hashning-på-hashning-på-hashning både blir username-specifik och challenge-specifik.
  • Bästa kryptografiska attacken, borde vara dictonary attack eller bruteforce. Inte ens om man vill angripa ettspecifik username är det värt att bygga en rainbow table för H3 = MD5(username,H2,””)  = MD5(username, MD5( MD5( password ), username ) ).
  • Är det inte uppenbart att en praktiskt attack förmodligen är så mycket enklare att detta är en overkill? En man-in-the-middle attack som byter ut javascriptet torde vara det enklaste, eller att lura på användarna en keylogger.
  • Seriöst… VARFÖR skickar ni ut den här länken till era läsare? Teknisk fuck-up eller försöker ni psyka tekniker/blodsugare?

Vänligen låt min brevlåda vara i fred!

Hej,

Det framgår inte i er tidning eller på er hemsida hur man når den som
ansvarar för tidningsutdelningen, så jag erlägger er att vidarebefodra
ärendet till rätt person inom er organisation.

Jag har ett problem: er tidningsutdelare respekterar inte min brevlåda.

Först satte jag upp ”REKLAM NEJ TACK”. Den respekterades inte, vilket
jag trodde kanske kunde vara ett spörsmål över vad definitionen på
reklam är. För att förhindra fortsatta problem så satte jag även upp
texten ”NEJ TACK till GRATIS TIDNINGAR å sånt” för att göra ärendet
kristallklart.

Systematiskt ignoreras även mina nya försök att lösa problemet.

Tyvärr så verkar det för mig nu uppenbart att ingen lapp jag kan
formulera kommer få era tidningsutdelare att följsamma budskapet,
därav att jag ber om ert ansvar att lösa ärendet.

Jag har inget emot er personligen eller den person som har arbetet att
dela ut tidningen, men jag ber er att skarpt uppmana honom/henne att
sluta våldföra sig på min brevlåda.

Hjälper inte detta brev till er så blir nästa åtgärd från min sida att
göra mitt problem till ert problem genom att kontakta er i ärendet
upprepade tillfällen tills dess ärendet är löst.
Hjälper inte det heller så kommer jag undersöka vilka lagar,
förordningar och intresseorganisationer som reglerar er verksamhet,
med syfte att lyfta problemet till högre instans.

Vänligen,

**************
**************

Trollhättan

Fötterna verker och har ca 5 -7 blåsor samt ett jack mellan stortå-muskulaturen och resten av foten. Blir en hel del fotvård i veckan som kommer. Men men, många cacher blev det!

Found it 8/30/2009 blaufish found Trollhättans konst (Multi-cache) Sweden [visit log]
Found it 8/30/2009 blaufish found SAAB Museum (Traditional Cache) Sweden [visit log]
Found it 8/30/2009 blaufish found Holmganga (Traditional Cache) Sweden [visit log]
Found it 8/30/2009 blaufish found Vatten #2 (Traditional Cache) Sweden [visit log]
Found it 8/30/2009 blaufish found Livvakterna (Traditional Cache) Sweden [visit log]
Found it 8/30/2009 blaufish found Hjortmosseparken (Traditional Cache) Sweden [visit log]
Didn't find it 8/30/2009 blaufish couldn’t find Trollhättan Locks by night (light) (Unknown Cache) Sweden [visit log]
Didn't find it 8/30/2009 blaufish couldn’t find BesonX (Multi-cache) Sweden [visit log]
Didn't find it 8/30/2009 blaufish couldn’t find Verkstabanan II (Multi-cache) Sweden [visit log]
Didn't find it 8/30/2009 blaufish couldn’t find Verkstabanan I (Multi-cache) Sweden [visit log]
Write note 8/30/2009 blaufish posted a note for In memory of statoil (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Rysskranen2 (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Slussporten (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Lasarettsdammen (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Thn church (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Suspension Bridge & Elvius’ Lock (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Copper Hill (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Slaskegatan (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Ancient homestead (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Vimpelkullen (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found In memory of Gransäter (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Ski Jumping Hill (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Skogshöjdparken 3 (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Skoghöjdsparken 2 (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Skogshöjdsparken (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Vatten #1 (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Phone home (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found NÄL (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Näl Tour #4 (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Näl Tour #1 (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Näl Tour #3 (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Gemini 2 (Unknown Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Tvillingarna (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Gemini 1 (Unknown Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Vårvik gravefield (Traditional Cache) Sweden [visit log]
Found it 8/29/2009 blaufish found Munin (Traditional Cache) Sweden [visit log]

Jag är en gammal gubbe :-)

Vuxen poäng till max idag, typ 90+ i mental ålder!

Sa till ungarna att de störde och att deras lek förmodligen skulle resultera i att hårdvaran gick i småbitar. Exakt vad hårdvaran heter vet det tusan, men det är en fet metallmojja som man hänger upp mattor på. De hängde överst i den, balanserad på den tills den slog över. Om och om igen med 1-3 barn ovanpå, snacka om att konstruktionen behöver ha marginaler vid specifikation av hålfasthet m.m.!