Java动态口令登录实现过程详解
什么是动态口令
- 动态口令是指使用时间限制的口令。
- 不同于常规的静态口令,动态口令需要设备生成一次性密码,具有更高的安全性。
动态口令登录的实现过程
- 用户在登录页面输入用户名和密码,提交表单给后端服务器。
- 后端服务器接收到表单后,根据用户名查询数据库中存储的该用户的密钥。
- 后端服务器随机生成一个6位数的随机数,并使用密钥生成一个一次性密码。
- 后端服务器将生成的一次性密码和随机数存储到数据库中,并将随机数返回给前端页面。
- 前端页面通过JS将用户输入的密码和后端返回的随机数作为参数,对密码进行加密处理。
- 加密后的密码和用户名一起提交表单至后端服务器。
- 后端服务器接收到表单后,重新生成一次性密码,并使用相同的算法判断加密后的密码是否正确。
- 如果密码正确,则将登录成功的信息存储到session中,并跳转至用户主页面。
- 如果密码错误,则返回登录错误的信息。
代码实现
后端实现代码
//查询该用户的密钥
String secretKey = userService.getUserSecretKey(username);
//生成6位数随机数
String randomNum = RandomUtil.getRandomNumber(6);
//使用密钥生成一次性密码
String otp = OtpUtil.generateOtp(secretKey, randomNum);
//将一次性密码和随机数存储到数据库
userService.saveOtp(username, otp, randomNum);
前端实现代码
//使用jsotp库生成动态口令
var totp = jsotp.TOTP("<?php echo $otp ?>");
var pin = totp.now();
//将生成的动态口令和随机数加密后提交表单
var ciphertext = CryptoJS.SHA256(pin + randomNum + password + username).toString();
示例说明
示例1:用户使用手机号和密码登录
- 用户在登录页面输入手机号和密码并提交表单。
- 后端服务器查询数据库中该用户的密钥,并生成一次性密码和随机数存储到数据库。
- 后端服务器将随机数返回给前端页面。
- 前端使用随机数和密码生成加密后的密码,和手机号一起提交表单至后端。
- 后端验证密码是否正确,如果正确则将登录成功的信息存储到session中。
示例2:用户使用谷歌验证码和密码登录
- 用户打开谷歌验证码APP,获取当前动态口令。
- 用户在登录页面输入用户名、密码和当前动态口令并提交表单。
- 后端服务器查询数据库中该用户的密钥,并生成一次性密码和随机数存储到数据库。
- 后端服务器将随机数返回给前端页面。
- 前端使用随机数和密码生成加密后的密码,和用户名一起提交表单至后端。
- 后端验证密码是否正确,如果正确则将登录成功的信息存储到session中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java动态口令登录实现过程详解 - Python技术站