利用HMAC MD5算法实现用户密码的注册、修改及验证
1. 用户注册
1.1 用户注册FORM
包含用户名(username)、密码(password)、重复密码(confirm_password)、图形验证码(imgcode)。在submit时进行下面的计算:
password.value = hex_hmac_md5(username.value, password.value)
confirm_password.value = hex_hmac_md5(username.value, confirm_password.value)
1.2 服务器端注册处理
判断图形码是否正确,用户名是否重复。如果都正常则将username和password保存在数据库中。这时数据库中实际保存的是hex_hmac_md5(username, password)的值。其中图形验证码是防止恶意注册。
2. 修改密码
2.1 用户修改密码FORM
包含用户名(username)、原密码(old_password)、新密码(new_password)、重复密码(confirm_password)、图形验证码(imgcode)。在submit时进行下面的计算:
old_password.value = hex_hmac_md5(username.value, old_password.value)
new_password.value = hex_hmac_md5(username.value, new_password.value)
confirm_password.value = hex_hmac_md5(username.value, confirm_password.value)
2.2 服务器端修改密码处理
判断图形码是否正确,并且判断new_password与confirm_password是否相同。如果都正常则判断old_password是否同数据库保存的密码相同,如果相同则将数据库中的密码修改为new_password。图形验证码是防止暴力破解。
3 登录验证
3.1 用户登录FORM
包含用户名(username)、服务器时间戳(server_timestamp)、服务器一次性令牌(nonce=hex_hmac_md5(server_timestamp, client_ip+client_port))、密码(password)。在submit时进行下面的计算:
password.value = hex_hmac_md5(hex_hmac_md5(username.value, password.value), nonce.value)
3.2 服务器端登录处理
验证时间戳在5分钟之内且nonce没有用过。hex_hmac_md5(数据库中的密码, nonce)要等于password.value。如果都成立则成功登录,删除Session中的nonce。否则重新取时间戳、生成nonce让用户重新登录。
4 不足之处
注册与修改密码仍然会在网上传播HASH值。为了更进一步的安全,要对HASH值进行加密传输。结合AES算法,能够进一步保证HASH值的安全。另外如果注册同修改密码用HTTPS,就省力很多。