Since the CRYPT validator generates a unique salt for each password hash, they will never be equal. If you are going to create your own custom register form, you will need to implement your own register controller logic to validate the password & confirm password match in clear text, then hash the value and add it to the database. Here is some sample code from one of my apps where I have "extra fields" and needed my own register:
I have bolded the important part. Note that your form should NOT have a requires = CRYPT. you have to do that after validating the form and making sure the values are equal in clear-text. def validate_form(form): if form.vars.password != form.vars.password_two: form.errors.password = 'Passwords must match' form.errors.password_two = 'Passwords must match' else: *form.vars.password = str(CRYPT(digest_alg='sha512',salt=True)(form.vars.password)[0])* form = SQLFORM.factory( db.auth_user.first_name, db.auth_user.last_name, db.auth_user.email, db.auth_user.year_of_birth, db.auth_user.zip_code, db.auth_user.news_and_updates, db.auth_user.sale_launch_alert, db.auth_user.ninety_pt_wine_alerts, db.auth_user.near_sellout_warning, db.auth_user.soldout_alert, db.auth_user.charity_updates, *Field('password', 'password'),* Field('password_two', 'password'), Field('tos', 'boolean', requires=IS_EXPR('bool(value)', error_message='You must agree'))) if session.invite: form.vars.first_name = session.invite.first_name form.vars.last_name = session.invite.last_name form.vars.email = str(session.invite.email).lower() #form[0].insert(-1, TR('', auth.settings.register_captcha)) if form.process(onvalidation=validate_form).accepted: if session.invite: # update the invite table to 'accepted' invite = db((db.invites.registration_key==session.invite.registration_key)).select().first() invite.status = 'accepted' invite.update_record() userid = db.auth_user.insert(**db.auth_user._filter_fields(form.vars)) member_group_id = db(db.auth_group.role == 'member').select().first().id auth.add_membership(member_group_id, userid) user_record = db.auth_user[userid] from utils import web2py_uuid user = Storage(db.auth_user._filter_fields(user_record, id=True)) auth.user = user ## subscribe user to mailchimp mailing lists from mailchimp import MailChimp mailchimp = MailChimp() mailchimp.create(user_record) session.auth = Storage(user=user, last_visit=request.now, expiration=auth.settings.expiration, hmac_key = web2py_uuid()) session.flash = 'Thank you for registering' redirect(URL('sales','current')) On Sunday, November 18, 2012 4:58:51 PM UTC-5, Daniele wrote: > > I have a field in my register form for verifying the password, as such: > > Field <http://127.0.0.1:8000/examples/global/vars/Field>('password', > 'password', length=512, readable=False), > Field > <http://127.0.0.1:8000/examples/global/vars/Field>('password_verify', > 'password', length=512, readable=False, requires=CRYPT > <http://127.0.0.1:8000/examples/global/vars/CRYPT>(digest_alg='sha512')) > > Even though I added requires CRYPT, this field gets stored as the user's > actual password > (without any encryption). I take it this is not a good thing. > > How can I encrypt even the verify password field on my registration form? > > Thanks > --