gglua配合后端实现简单卡密验证

首先声明我这里的后端使用的是Java 小白建议使用php

验证介绍

其实验证没有想象的那么难 可以保证的是市面上的所有卡密验证都是同一个逻辑 例如wig 极简云 微验等等

因为玩不出花这东西验证应该考虑的是安全性问题和稳定性 例如服务器抗不抗揍(极简云:我真的会谢)验证好不好跳过(也就是破解验证)基础的逻辑都是一样的这根本玩不出花

验证的步骤

想写一个验证就分这几步 完成了后就是一个验证了

  1. 生成卡密
  2. 设置卡密的使用时长
  3. 获取机械码(设备码)
  4. 验证用户输入的卡密与机械码

最基础的验证就分这几部 当然刚刚说的wig 极简云 微验等 肯定是不止这些的 不过具体还是按自己的需求来 例如wig是收费的 他就有会员用户的数据 极简云就没有 还可以将机械码加密来提高安全性 不过这些都是看自己的具体需求

生成卡密

生成卡密我知道的除了我 wig也是随机生成的 当然也可以塞点东西在卡密里 例如机械码 不过这样的话卡密就需要加密了 一般是不需要随机生成就好了

Java的话直接使用UUID对象生成即可

lua或者php可以用随机数+格式化字符串生成

这里需要注意的是生成卡密一般是交给后端来做的

php我不是很熟悉不过用随机数+格式化字符串肯定是可以随机生成卡密 包括Java也可以 只不过使用UUID对象生成会更方便

生成的卡密我们需要放到数据库中 不要放在文件里 不安全而且也使用也不方便

设置卡密时长

这一步只需要把设置时长放在生成卡密的下级视图或者同级视图然后把请求一起发给后端即可

卡密时长推荐使用time因为可能精确到秒 显示卡密到期时间只需要把time转为日期(date)即可

当然也可以同时生成time和date一起发给后端 然后后端把数据进行验证(例如卡密时长是否合法)并保存到数据库中即可

获取机械码(设备码)

这里因为机械码需要绑定到用户使用的这个卡密 所以是在lua中获取的

而原生的lua是无法获取设备信息的(设备码)

解决方法是给gg加库使用Java去获取 或者用最原始的方法 随机生成一个(和生成卡密一样的逻辑)但是这样你就需要把机械码保存到本地 这可能会有安全性的问题

或者可以使用独猫的luajava修改器调用Java的对象来获取设备码

小白建议随机生成

验证用户输入的卡密与机械码

这一步通俗易懂 使用gg.prompt函数让用户输入卡密 再把机械码一起作为参数发给后端即可

这里需要注意的是后端需要判断这个卡密是否存在 并且这个卡密是否绑定了机械码

如果卡密不存在 那么肯定是无法登陆的

如果卡密存在 但是机械码被绑定了 这时就需要判断这个卡密绑定的机械码是否是用户的机械码 如果不是也是无法登陆的 因为如果不是的话证明这个卡密已经被别的用户使用了

反之如果机械码是用户的机械码那这时就可以登陆

当然也可以自己加些别的条件判断来加强卡密的安全性

关于机械码的一些问题

这里机械码为什么要加密呢?

大家可以想想 不管我是使用Java获取本机的设备码还是随机生成一个设备码 只要随机算法写的好每一个设备码都是唯一的 那么竟然是唯一的为什么要加密呢?

各位可以换个位置想象一下 如果我现在需要破解一个卡密该怎么做 按照我们现在的业务逻辑 想要破解自己的验证首先是不是可以改卡密的时长例如改成100年后过期

修改卡密时长

那么这一步我们该怎么避免呢?

如果这样的话我们可以在后端代码上下手 例如把卡密时长也进行加密 或者每一次访问都需要一个秘钥 而这个秘钥可能每秒更新 可能每天更新 这都取决各位

那么设置秘钥有什么用呢?

假设我现在要改某一个卡密的时长 那我不管怎么做都要向后端发送请求对吧 那么如果我的秘钥是每秒更新一次 连我自己都无法预测 这时候破解人员又怎么知道我的秘钥是什么呢

当然这是有前提的 就是你的后端的文件是安全的 毕竟如果后端代码都被恶意篡改了 那什么验证都没用

修改机械码

那么可以想到的第二点就是改设备码

大家可以想象一下你知道了某个人的卡密和机械码

那这时候我想要破解他是不是就很简单了 直接把请求里的设备码给改成这个用户的设备码是不是就跳过了

而这点是可以通过后端代码避免的

例如我们在生成或或者机械码时先加密后再发给后端 后续不管是本地还是服务器存放的数据也都是加密的

在登陆时我们把加密的机械码发给后端 后端程序再进行解密来判断是否与数据库中的一致

当然这是有前提的 就是你的后端的文件是安全的 毕竟如果后端代码都被恶意篡改了 那什么验证都没用

简单验证例子与介绍

先把代码奉上再解释

首先是后端(Java)代码


import com.alibaba.fastjson.JSONObject;
import com.example.ggluaweb.web.mapper.ggVerify;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 白
 */
@RestController
@RequestMapping("/verify")
public class demoWeb {

	@Autowired
	private ggVerify ggVerify;

	@PostMapping("/verifyKami")
	public String jsonDemo(@RequestBody JSONObject json) {
		return ggVerify.verifyKami(json.getString("data"));
	}
}

这里只写了一个接口并且没有做任何防护

各位可以按照自己需求修改代码逻辑

然后是客户端(lua)代码

---
--- Created by 白.
--- DateTime: 2023/12/9 20:15
--- @author 白
--- @module convertTablesToJSON.lua

-- 发送post请求
-- @string url 请求地址
-- @table[opt={["Content-Type"]="application/json",["Host"]="127.0.0.1:8080"}] 请求头
-- @string 请求体
function post(url,header,body)
    if not url then
        error("请求错误!url不能为空!")
    end
    if not header then
        header={
            ["Content-Type"]="application/json",
            ["Host"]="127.0.0.1:8080",
            ["Accept"]="*/*"
        }
    end
    if not body then
        error("请求错误!请求体为空!")
    end
    return gg.makeRequest(url,header,body)
end

-- 三目运算
-- @bool 条件
-- @object value1 条件成立时的返回值
-- @object value2 条件未成立时的返回值
function ThreeEyed(condition,value1,value2)
    if condition then
        return value1
    else
        return value2
    end
end

-- 将lua的表转为json字符串
-- @table tab lua表 也可以是LuaJava中的HashMap 要和json数组格式相同
-- @return @string 表转换为json后的json字符串
function toTableJSON(tab)
    local ret="{"
    -- 这里判断为Java对象(及Map)但不推荐使用Map集合作为参数
    if type(tab) == "userdata" then
        tab=load("return "..tab.toString())()
    end
    for i, v in pairs(tab) do
        if type(v) == "function" then
            error("参数错误!请严格按照json数组格式 不要使用function作为参数")
        end
        if type(v) ~= "table" then
            ret=ret.."\""..i.."\":"
            if type(v) == "string" then
                ret=ret.."\"..v..\""
            elseif type(v) == "number" then
                ret=ret..v
            end
        else
            toTableJSON(v)
        end
        ret=ret..","
    end
    ret=ret:sub(1,#ret-1).."}"
    return ret
end

function verifyMain()
    local kami=gg.prompt({"输入卡密"},{nil},{"text"})
    if not kami then
        print("请输入卡密后点击确定")
        return
    elseif not kami[1] or kami[1]=="" then
        print("请输入卡密后重试")
        return
    else
        local kamiData=kami[i]
        local response=post("http://127.0.0.1/verify/verifyKami",nil,toTableJSON({data=kamiData}))
        if response.content==kamiData then
            script()
        end
    end
end

function script()
    print("验证通过")
end

verifyMain()

因为我这里Java的后端是需要一个json的数据(习惯问题不要学我)所以lua里写了一个把lua的表转为json数组

代码介绍

这里只会挑一部分代码进行解释 因为其实对于小白来说其实根本看不懂...

Java

对于Java代码我就一笔带过了 有JavaWeb基础的看这个代码还是很简单的 如果没有学过Java 那介绍也不懂

简单来说这段代码就是开放了一个接口 这个接口的地址是http://ip:8080/verify/verifyKami

而其中的ggVerify对象是一个MyBatis项目 sql这里就不放了

Lua

lua代码其实只需要重点关注verifyMain函数的代码就行了

里面首先是定义了一个输入框 这个输入框只有一个东西就是让用户输入卡密

然后经过了卡密格式判断后 最后发送请求并将响应结果与用户的卡密内容进行判断

如果正确那么就通过

这是我随便写的 请不要拿去直接用 对于小白来说很有可能用不了

因为我是在本地搭的环境 需要改的东西有点多

如果有lua基础的建议去学一下php就会写了

在学习php之前先自己用lua写几个简单的本地验证 理解了原理后就很简单了 php就和lua一样 学个两三天就会写了

如果没有lua基础 先去学lua基础 人都是一步一步慢慢走的

编程也是 先有lua基础后再去学php会更简单 不要想着一步登天!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用NodeJS实现一套验证系统的步骤: 1. 首先,需要创建一个Express应用程序来处理HTTP请求和响应。可以使用以下命令创建一个新的Express应用程序: ``` npm install express-generator -g express myapp cd myapp npm install ``` 2. 接下来,需要创建一个数据库来存储和相关的信息。可以使用MongoDB来实现,也可以使用其他的数据库。可以使用以下命令安装MongoDB驱动程序: ``` npm install mongodb --save ``` 3. 创建一个模型来定义的结构和方法。可以使用以下代码创建一个名为Card的模型: ``` var mongoose = require('mongoose'); var cardSchema = new mongoose.Schema({ code: { type: String, required: true, unique: true }, value: { type: Number, required: true }, used: { type: Boolean, default: false }, createdAt: { type: Date, default: Date.now }, updatedAt: { type: Date } }); cardSchema.pre('save', function(next) { this.updatedAt = new Date(); next(); }); module.exports = mongoose.model('Card', cardSchema); ``` 4. 创建一个路由来处理HTTP请求。可以使用以下代码创建一个名为cards的路由: ``` var express = require('express'); var Card = require('../models/card'); var router = express.Router(); router.post('/validate', function(req, res) { var code = req.body.code; Card.findOne({ code: code }, function(err, card) { if (err) { return res.status(500).send(err); } if (!card) { return res.status(404).send('Card not found'); } if (card.used) { return res.status(409).send('Card has already been used'); } card.used = true; card.save(function(err) { if (err) { return res.status(500).send(err); } res.send({ value: card.value }); }); }); }); module.exports = router; ``` 5. 在应用程序中使用路由。可以使用以下代码将路由添加到应用程序中: ``` var express = require('express'); var bodyParser = require('body-parser'); var mongoose = require('mongoose'); var cards = require('./routes/cards'); var app = express(); mongoose.connect('mongodb://localhost/cards'); app.use(bodyParser.json()); app.use('/cards', cards); var server = app.listen(3000, function() { console.log('Listening on port %d', server.address().port); }); ``` 6. 运行应用程序。可以使用以下命令启动应用程序: ``` node app.js ``` 以上就是使用NodeJS实现一套验证系统的步骤。可以根据实际需求对代码进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值