我在开发一个基于 Spring Boot 和 Vue 的前后端分离项目,现在面临一个需求:为软件添加许可证功能,从而区分试用版、正式版等,并通过激活码或许可证文件进行软件激活。目前想到的实现思路:后端( Spring Boot ):用于生成、验证和存储许可证信息。前端( Vue.js ):用于让用户输入激活码、上传许可证文件或显示激活状态等。还有一些疑虑:许可证的验证应该在哪一端进行?只在后端进行还是两端都需要?如何确保前端和后端的许可证验证同步?对于前后端分离的项目,有没有哪些特定的安全性问题需要注意?是否有推荐的库或工具,特别是适合这种架构的?如果有相关经验或建议,希望能与我分享,感谢!

问 ai 更快获得解决方案。。

  1. 放后端,登录的时候做授权验证,过不了都登不上所以前端不用做2. 没明白啥意思,但放登录的话应该能解决你这个疑问3. 太宽泛4. 估计 github 上有相关库吧说说我遇到的问题,就是你做 license 验证肯定要跟硬件信息绑定,但如果你是容器化部署的话就不太好处理了,但也有方案比如 ssh 到宿主机获取信息,但感觉不是个好方法。

前端验个格式就行(类似身份证号最后一位那种校验和机制) 后端检查授权真实性、关联设备因为前后端验证任务不同,也不用保持同步后端应该还好,前端需要防破(防止绕过验证机制直接进入已激活状态),比如代码混淆(指令加花),但是这只能延缓被破解的进度,不能彻底防止破解(就是一猫鼠游戏)利益相关:没有相关建议,上面的思路都是自己瞎想的,看看能不能引出玉来

没有相关建议 ==> 没有相关经验。。。V2EX 的回复连一分钟的修改窗口期都不给吗

看你需求是什么形态,激活码模式?登录会员账号的模式?订阅模式?是 pc 端软件还是移动端?是否能离线使用?是否需要试用版?续期如何解决?验证我觉得应该是丢给后端验证了一般思路是前端生成一个唯一特征的信息丢给后端,再加密,再给这个加密信息附上许可有效相关的信息,最后生成许可证

激活码模式,有试用版和正式版,激活后可离线使用,网页应用

目前是容器化部署的,可能不太好获取宿主机信息,开源库找到了 TrueLicense

这边一个项目的做法,只后端,op 可以参考一下。一个专门的 License 应用,用于生产 License code ,正式应用这边加了个拦截器,验证这个 License code 。License code 是一个项目标志加一个时间戳用 rsa 的私钥加密生成的,应用拦截器这边,获取数据库和应用容器的时间,判断是否一致,不一致直接拦截,然后用公钥解密,判断项目标志与配置的是否一致,时间是否有效。不过这个东西就是防君子不防小人。

确实是防君子不防小人。反编译 jar 包,直接找你验证代码,注掉替换,就免费了。不过反过来说,至少比敞开着门强一点。

写了一点想法, 然后发现是个网页应用, 所以这其实是一个纯前端的应用, 脱离后端也能运行?后端只负责验证?在我的印象中纯前端验证就约等于没有验证, 或者说防君子不防小人...

考虑 License 和宿主机的主板 ID 进行绑定 linux 下使用命令 dmidecode -t system 可以拿到主板相关的信息, 如果在容器内访问可以参考文档: stackoverflow.com/questions/54068234/cant-run-dmidecode-on-docker-container一旦 License 和主板 ID 绑定(可以限制这个 License 可以用于多少台机子),如果激活完成后复制到其他机子就没办法使用. 关于 License 建议放后端

github.com/oshi/oshi/blob/master/oshi-core/src/main/java/oshi/driver/linux/Dmidecode.java貌似这里有一个示例

使用 RSA 验签吧,废话不多说,直接上代码。javapublic static void main(String[] args) throws Exception { final KeyPair pair = KeyPairGenerator.getInstance("RSA").generateKeyPair(); System.out.println(Base64.getEncoder().encodeToString(pair.getPrivate().getEncoded())); System.out.println(Base64.getEncoder().encodeToString(pair.getPublic().getEncoded())); // 采用密文公开+签名的方式 byte[] signature; byte[] license = "{\"username\":\"张三\"}".getBytes(StandardCharsets.UTF_8); // 私钥得到签名 { Signature signer = Signature.getInstance("SHA1withRSA"); signer.initSign(KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(pair.getPrivate().getEncoded()))); signer.update(license); signature = signer.sign(); } // 公钥验证签名 { Signature signer = Signature.getInstance("SHA1withRSA"); signer.initVerify(KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(pair.getPublic().getEncoded()))); signer.update(license); System.out.println(signer.verify(signature)); }}在 java 里面,无论你是什么加密都可以通过 javaagnet 给你搞掉,所以防君子不小人。

v 站没有渲染代码块的功能吗

要想绝对高强度不可能被破解(防君子也防小人),就试试使用 TPM 吧 patents.google.com/patent/WO2012149717A1/zh

在你的基于 Spring Boot 和 Vue 的前后端分离项目中添加许可证功能是可行的。下面是一些实现思路和建议:后端( Spring Boot ):实现许可证生成:编写逻辑来生成许可证,可以包括许可证的格式、加密算法等。许可证验证:在后端进行许可证的验证,确保传递的激活码或许可证文件是有效的。许可证信息存储:将许可证相关信息存储在后端,可以使用数据库或其他持久化方式。前端( Vue.js ):用户界面:设计一个用户界面,用于用户输入激活码、上传许可证文件或显示激活状态等。与后端通信:通过接口与后端进行通信,包括发送激活码或许可证文件并接收验证结果等。关于你的疑虑:许可证的验证可以在后端进行,因为后端可以更可靠地处理验证逻辑和密钥存储。前端可以发送激活码或许可证文件到后端进行验证。为了确保前后端的许可证验证同步,可以在后端实现一个许可证验证的接口,前端通过调用该接口进行验证,并根据验证结果做出相应的处理。对于前后端分离的项目,确保接口安全性是重要的,可以使用身份验证和授权机制来保护许可证接口。另外,确保许可证相关的敏感信息在传输过程中进行加密保护。关于库或工具,Spring Security 是一个流行的安全框架,可以用于后端的身份验证和授权。在前端方面,可以考虑使用 Vue Router 和 Vuex 来管理路由和状态。总之,许可证功能的实现需要在后端生成和验证许可证,前端提供用户界面,并与后端进行通信。确保接口的安全性,并选择适合你的项目的安全框架和库。

我现在用的 truelicense-core 已实现效果,可以去了解下

这个问题问的好!!!

chatgpt 是吧😂

谢谢,我试试看

好的,谢谢

正在看 TrueLicense 的文档

这个是怎么出售的的?后端也卖给别人吗?这种很难防住的。

用 classfinal 把代码加密下

项目价值确实高的话,就不自己瞎倒腾,直接上 codemeter ,自己倒腾参照 IDEA,年年有破解。。

检查环境,定期连接互联网服务器核查续期

javaagent 在那,很难防得住,当然基本的 license 检查和代码混淆还是要做的,另外还要考虑多破解的检查以支持法务的介入。这东西往难了做能做的很复杂,可以搞专门的加密狗一样的东西,甚至必须用专有定制的硬件,还是要综合考虑成本值不值

参考 J2eeFast 这个项目看看呢