最近维护的游戏项目遇到了一些安全方面的问题,后台的账号密码被海外黑客破解登录,造成了一些损失。
一般的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"] = "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("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,映射到用户身上。

获取验证码
在用户点击登录的时候,就会同时校验密码和验证码的准确性,只要一方出现错误就不允许登录。同时登录成功后就会删除老的验证码,这样用户使用同一个验证码重复登录是无效的。
这样,一个简单的邮件验证码校验机制就完成了,由于邮箱与用户账号深度绑定,除非黑客破解数据库,才有更改邮箱的权限,否则他收不到校验码,一般就很难通过破解账密登陆了。