最近维护的游戏项目遇到了一些安全方面的问题,后台的账号密码被海外黑客破解登录,造成了一些损失。
一般的GMT后台登录我们都只是简单的做一层校验,就是账号密码验证,只要账号密码验证通过,基本就能进后台进行操作。当然基于安全处理,所有的基于后台的请求都会带上token,这个token就是后台登录的时候返回给前端的一个校验码。
不知道是由于账密太简单还是什么其他原因,反正证实了确实被人非法在其他IP登录了后台,所以急需提升登录安全性校验。
常见的安全校验是通过手机短信,就是通过发送手机验证码来进行双重校验。但是由于这只是一个小范围内部使用的后台,出于成本考虑,我决定选用邮件来发送验证码,以达到同样的双重校验目的。
Ok,言归正传,下面就是简单的一个入门教程,教大家如何使用Java发送邮件验证码,来完成一整套完整的校验流程。
第一步,按照惯例给出maven配置,我采用的是javax.mail库1.4.7版本。这已经是比较新的一个版本,目前最新的是1.5.0-b01,个人建议学习可以用新版本,如果是项目急需的最好选用老的成熟的稳定版本。
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
下面我就以126邮箱为例,进行一个流程讲解。首先申请一个126邮箱,这一步完成后就可以开始写代码了。
首先,我们写一个对外的发邮件方法。
private val props = Properties() private val auth = MyAuthenticator() init { //设置邮件服务器地址,连接超时时限等信息 props["mail.smtp.host"] = "http://smtp.126.com" props["mail.smtp.auth"] = "true" props["mail.smtp.connectiontimeout"] = "10000" props["mail.smtp.timeout"] = "25000" } /** * 邮件发送 * * @param receiver * @param subject * @param content */ fun send(receiver: String, subject: String, content: String) { if (receiver == "") { return } //创建缺省的session对象 val session = Session.getDefaultInstance(props, auth) //创建message对象 val msg = MimeMessage(session) //设置发件人和收件人 try { // 设置发件人 val internetAddress = InternetAddress("xxxxxx@126.com") internetAddress.personal = "SAO2 GAME" msg.setFrom(internetAddress) // 设置收件人 val addressTo = InternetAddress(receiver) msg.setRecipient(Message.RecipientType.TO, addressTo) //设置邮件主题 msg.subject = subject msg.setText(content) // 设置传输协议 val transport = session.getTransport("smtp") transport.connect("http://smtp.126.com", "xxxxxxx@126.com", "password") transport.sendMessage(msg, msg.allRecipients) transport.close() } catch (e: Exception) { e.printStackTrace() } } class MyAuthenticator: Authenticator() { override fun getPasswordAuthentication(): PasswordAuthentication { return PasswordAuthentication("xxxxxx", "auth_key") } }
所有的源码都在上面,我简单讲一下几个参数配置。
首先是这部分邮箱服务器的基本信息,包括使用的协议和超时时间等,这些都可以根据自己的实际开发要求设置。
参数配置
其次是,大家可以看到一个MyAuthenticator,这个auth其实是最新的邮箱校验码,它的配置方式如图:
授权验证
这个xxxxxx是你自己的邮箱地址不含@后面部分,后面的auth_key要特别注意,这个不是你的邮箱密码,而是要登陆邮箱后去申请第一个校验码。在邮箱设置里,找到协议设置。
image.png
image.png
然后点击开启,打开对应的服务,根据提示,你会得到一个校验码。校验码只会显示一次,如果忘记了,你也可以在下面重新申请。
新增授权码
Ok,如上就基本完成了邮件发送的所有准备工作。
接下来就是实现发送邮件校验码了,首先新增一个对外接口,叫用户校验user_verify,用户点击获取校验码后就会发送该接口到服务器,服务器就会根据收到的账号找到用户,并根据用户的邮件地址发送一个全局校验码,同时服务器会临时存储这个校验码,比如建一个map,映射到用户身上。
获取验证码
在用户点击登录的时候,就会同时校验密码和验证码的准确性,只要一方出现错误就不允许登录。同时登录成功后就会删除老的验证码,这样用户使用同一个验证码重复登录是无效的。
这样,一个简单的邮件验证码校验机制就完成了,由于邮箱与用户账号深度绑定,除非黑客破解数据库,才有更改邮箱的权限,否则他收不到校验码,一般就很难通过破解账密登陆了。