Hi Anthony,

Many thanks. Just to check - option 1 would have to be done in the web2py 
codebase (i.e. outside of the application code)? I don't think there's any 
simple way of overriding the version of simple_hash imported from 
gluon.utils that LazyCrypt() calls.

Both the other options can be done in a model file, I think. 

Cheers,
David

On Friday, 27 May 2016 05:51:40 UTC+1, Anthony wrote:
>
> Aside from forking the framework, I suppose you could take one of these 
> approaches:
>
>    1. Monkey patch gluon.utils.simple_hash.
>    2. Subclass validators.CRYPT and validators.LazyCrypt, and in 
>    LazyCrypt, replace the __str__ method with one that calls a custom 
>    simple_hash function.
>    3. Create an entirely new custom hashing validator that replicates the 
>    algorithm used by the other app.
>
> Anthony
>
> On Thursday, May 26, 2016 at 1:19:35 PM UTC-4, David Orme wrote:
>>
>> Hello,
>>
>> I've got an application where I'm sharing a database with a second (non 
>> web2py) framework. I want my web2py application to handle user registration 
>> and would like to avoid users having two passwords (partly so that only 
>> web2py ever writes to the auth_user table).
>>
>> Inevitably, the hashed password storage formats differ, but I can match 
>> the hash algorithm between the two frameworks:
>>
>> db.auth_user.password.requires = CRYPT(digest_alg='sha512')
>>
>> Then I can just calculate the value of a second hashed password field in 
>> the foreign format - it involves recoding the string as base64, not hex, 
>> but that can be achieved using a computed field.
>>
>> def alt_password(r):
>>     passwd = r.password.split('$')
>>     alt = base64.b64encode(passwd[1].decode('hex')) + \
>>                 '*' + base64.b64encode(passwd[2].decode('hex'))
>>     return alt
>>
>>
>> auth.settings.extra_fields['auth_user']= [
>>     Field('alt_password', compute=lambda r: alt_password(r))
>>     ]
>>
>>
>>
>> *Except...* the simple_hash function in web2py uses (password + salt) as 
>> an input and the second framework uses (salt + password), which means there 
>> is no way to reproduce the second format from the stored hashed password. I 
>> can hack the web2py utils.py file on my installation to reverse this but I 
>> wanted to check if there was a more elegant way of overloading the 
>> simple_hash function without having to change the codebase, which makes my 
>> application unstable to upgrade.
>>
>> I did wonder about extending the settings to include a salt order, but I 
>> think that would mean you'd have to extend the password string to record 
>> the order: alg$order$salt$hash. That seems like a bit of a big change for a 
>> fairly fringe use case!
>>
>>
>>
>>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to