Re: [Fwd] How to make a secured login form
| From: | German Geek | Date: | Sat, 14 Feb 2009 09:58:52 +0000 |
| Subject: | Re: [Fwd] How to make a secured login form | ||
| References: | 1 2 3 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-288249@lists.php.net to get a copy of this message | ||
Have a look at my post called "for the security minded web developer -
secure way to login?". It seems like a similar idea with less overhead.
Regards,
Tim
Tim-Hinnerk Heuer
http://www.ihostnz.com
Joan Rivers - "Never floss with a stranger."
2009/2/14 Virgilio Quilario <virgilio.quilario@gmail.com>
> > I have secured the login form for my CMS with a challenge-response thing
> > that encrypts both username and password with the
> > (login-attempts-counted) challenge (and; here's my problem: a system
> > hash) sent by the server (it would end up in your html as a hidden
> > inputs, or as part of a json transmission)..
> >
> > Since then, i've found these libs that do even longer one-way-crypto:
> > http://mediabeez.ws/downloads/sha256.js-php.zip
> > The principles i'm about to explain stay the same.
> >
> > *but i'd really like to know if my crypto can be improved*
> >
> > So instead of the browser getting just a text-field for username and
> > password, you also send the "challenge" (and "system_hash") value.
> > That's a 100-character random string (include special characters!), then
> > sha256-ed (for prettiness mostly i think).
> >
> > I really wonder if i can do without the systemhash..
> >
> > ------------------------------------ HTML
> --------------------------------
> > <form id="myForm">
> > <input type="hidden" id="system_hash"
> > name="system_hash"
> > value="[SHA256 SORTA-MASTER-KEY__DUNNO-WHAT-TO-DO-WITH-THIS]"/>
> > <input type="hidden" id="challenge" name="challenge"
> > value="[SHA256RANDOMSTRINGFROMPHP]"/>
> > <table>
> > <tr><td>Login</td><td> </td><td><input
> > id='login'
> > name='login'/></td></tr>
> >
> > <tr><td>Password</td><td> </td><td><input
> > id='pass'
> > name='pass'/></td></tr>
> > </table>
> > </form>
> >
> >
> > ------------------------------------ JS
> ------------------------------------
> >
> > $('#myform').submit (function() {
> > var s = ($'system_hash')[0];
> > var c = ($'challenge')[0];
> > var l = $('#login')[0];
> > var p = $('#pass')[0];
> >
> > l.value = sha256 (sha256 (l.value + s.value) + c.value);
> > p.value = sha256 (sha256 (p.value + s.value) + c.value);
> >
> > //Here, submit the form using ajax routines in plain text,
> > as both the login name and
> > //password are now one-way-encrypted.
> > //
> > //on the PHP end, authentication is done against a mysql
> > table "users".
> > //
> > //in this table i have 3 relevant fields:
> > //user_login_name (for administrative and display purposes)
> > //user_login_name_hash (==sha256 (user_login_name +
> > system_hash))
> > //user_password_hash (== passwords aint stored unencrypted
> > in my cms, to prevent admin corruption and pw-theft by third parties;
> > the password is encrypted by the browser in the "new-password-form" with
> > the system hash before it's ever sent to the server. server Never knows
> > about the cleartext password, ever.)
> > //
> > //when a login-attempt is evaluated, all the records in
> > "users" table have to be traversed (which i admit can get slow on larger
> > userbases... help!?! :)
> > //for each user in the users table, the loginhash and
> > password hash are calculated;
> > // $uh = sha256 ($users->rec["user_login_name_hash"] .
> > $challenge);
> > // $pwh = sha256 ($users->rec["user_password_hash"] .
> > $challenge);
> > //and then,
> > // if they match the hash strings that were sent (both of
> > them),
> > // if the number of login-attempts isn't exceeded,
> > // if the IP is still the same (as the one who first
> > requested the html login form with new challenge value)
> > //then, maybe, i'll let 'm log in :)
> > });
> >
> >
> >
> >
> > phicarre wrote:
> >>
> >> How to secure this jquery+php+ajax login procedure ?
> >>
> >> $('#myform').submit( function()
> >> {
> >> $(this).ajaxSubmit( {
> >> type:'POST', url:'login.php',
> >> success: function(msg)
> >> {
> >> **** login ok : how to call the welcome.php ***
> >> },
> >> error: function(request,iderror)
> >> {
> >> alert(iderror + " " + request);
> >> }
> >> });
> >> return false;
> >> })
> >>
> >>
> >> <form id="myForm" action="" >
> >>
> >> Name : <input type='text' name='login'
> >> size='15' />
> >> <div>Password : <input type='password'
> >> name='passe' size='15' /
> >>
> >>>
> >>> </div>
> >>>
> >>
> >> <input type="submit" value="login"
> >> class="submit" />
> >>
> >> </form>
> >>
> >> Login.php check the parameters and reply by echo "ok" or echo "ko"
> >>
> >> Logically if the answer is ok we must call a welcome.php module BUT,
> >> if someone read the client code, he will see the name of the module
> >> and can hack the server.
> >> May I wrong ? how to secure this code ?
> >>
>
> i think you should drop the IP address out of the equation because
> when you're behind a firewall with rotating outgoing IP addresses, you
> will never get authenticated.
>
> also, traversing users table is a slow operation as you pointed out.
>
> i guess you should look into two way encryption or use ssl which is
> better and easier to implement.
>
> virgil
> http://www.jampmark.com
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>