离线软件激活码生成方案?

2020-07-25 20:55:46 +08:00
 okface
用 python 的 wxpython 写了个小软件,这软件也值不了几个钱,用户也都是完全不懂注册机和破解的人,想问大家最简单实现的离线认证方案是什么呢
10577 次点击
所在节点    程序员
40 条回复
stillyu
2020-07-25 22:20:19 +08:00
涉及到时间,注册码这一类的都不行,用带内置时钟的加密狗
ifxo
2020-07-25 22:31:50 +08:00
简单就是 vmprotect,加壳防破解,激活码和时间限制全都有,还有很多虚拟化软件都可以做到,直接把你的 exe 文件打包,都挺贵的
love
2020-07-25 23:23:48 +08:00
lz 都说了只防君子不防小人,那用简单的过期时间+随机字串加密得到码,程序里解码就行
silymore
2020-07-26 00:04:11 +08:00
楼上说 rsa 的那种密钥都很长吧,几十字节,离线不好输入的,有短的方案吗,普通软件 12 或者 16 位那种是怎么弄的
wangyzj
2020-07-26 00:49:06 +08:00
20200726 << 1
abc612008
2020-07-26 01:05:39 +08:00
@silymore 不确定安全性怎么样,但是可以把 rsa 签名再 hash 一遍减少长度。
abc612008
2020-07-26 01:06:25 +08:00
@silymore @abc612008 想了下不大对,hash 完了就没法校验了…
shiji
2020-07-26 04:18:27 +08:00
@tivizi 上一代的 Navicat 的破解方法就是直接扒出来软件里的公开证书,替换掉。
ysc3839
2020-07-26 06:27:01 +08:00
@silymore 要短的话只能缩短 RSA 密钥的位数,但安全性会大大降低。
网上许多输入短注册码的程序被破解出注册机,可能不是因为开发商不知道用非对称加密算法,而且因为长度太短了很容易就被暴力破解了。
delectate
2020-07-26 08:12:14 +08:00
就看你肯付出的成本。
低成本就是 硬件 id+timestamp+随机码,注册码含时间限制或者永久激活信息;
中成本是硬件狗;
高成本是加上一个通信模块(如 4g 通信模块+电波 /gps 授时模块),根据硬件上报的数据进行判断。

不过,既然都离线了,就别整那些没用的,有一万种方法破解,强如微软不也无可奈何吗?
zjgsamuel
2020-07-26 08:41:45 +08:00
硬件狗省事~
ys0290
2020-07-26 09:27:28 +08:00
@ysc3839 内置计数器可否?超过限定时间就过期
ychost
2020-07-26 10:36:39 +08:00
简单点,再复杂的都能破,参考 RSA 校验
CallMeReznov
2020-07-26 11:58:30 +08:00
你既然都说不懂了,就直接在脚本里写好 deadline 然后用 pyinstaller 打包,超过时间就不允许运行.

如果别人硬是想破解,py 的话怎么都能整出来源码啊
zxcslove
2020-07-26 12:30:46 +08:00
楼主啊,现在智能手机普及,可以视为一个变相联网的途径,可以考虑这方面做一些文章。比如有些软件通过公众号获取使用密码的思路。
learningman
2020-07-26 13:03:17 +08:00
如果用户是真的完全不懂。。。
我觉得 input() == key 就够了
realpg
2020-07-26 13:55:42 +08:00
给你个最简单的算法 不反破解的 只防啥也不懂的

C:\Users\{Username}\AppData\Local\
首次启动,向目录写入一个文件
文件名为
register.db
文件内容为一个 50 位的随机数,两次 md5 后的字符串纯文本

然后 输入注册码的界面 显示一个机器码 这个机器码得出的方式为 那个文件的两次 md5 值,不是那个文件的内容,机器码为 32 位的 16 进制字符串,也可以将其转为 10 进制变为一个长数字

然后给你机器码 你用算法算成注册码给用户 用户填入得出授权是否有效


注册码生成算法为
预设到期日期假如为 20200901,转成字符串,拆解成 8 个字符 记为 A B C D E F G H

机器码进行 sha1 得出一个十六进制字符串,拆解成 char 数组,按以下索引顺序重新组合成一个字符串 其中 ABCDEFGH 是上文的字符

7,29,A,4,0,B,12,2,C,1,14,D,9,32,E,17,4,F,19,33,G,13,24,H,5,27,30,20


得到一个 28 位的字符串

然后将这个 28 位的字符串进行 SHA1 hash,得到一个字符串,取其中的第 9 位开始,连续取 4 位,字符串,作为校验码


然后将前面的 28 位字符串和这四位校验码进行拼接成一个字符串,作为注册码。


在离线 APP 验证时,先通过后四位计算注册码合法性

然后用机器码计算出 hash 判断前面的合法性,如果完全合法,提取出 ABCDEFGH 拼接成到期日期
ysc3839
2020-07-26 13:56:03 +08:00
@ys0290 “内置计数器”指的是什么?
phithon
2020-07-26 14:32:02 +08:00
你想的太复杂了,不考虑破解的情况下,就可以简单用 sha256 这类哈希来解决。

具体方案我举个例字。你首先准备一个你自己的密钥 key,你给用户签发注册码的时候,就是简单的这样:

sha256(当前时间戳 time, key)

然后得到一个签名字符串 cert,然后你再把当前时间戳附在这个 cert 后面,形成一个新的字符串 cert:time,这个就是你给用户签发的注册码。

然后用户填写这个字符串以后,程序拿到这个字符串,用冒号分割,得到 cert 和 time 。然后程序先用自己内置的密钥 key 来重新计算一遍 sha256(time, key),和用户传入的 cert 比对,如果不相等,则直接退出;如果相等,我们再比较当前时间,和用户传入的时间 time 的差,是否超过你要求的期限,如果超过,也直接退出。
lopetver
2020-07-27 08:26:13 +08:00
建议去吾爱破解问下,那里矛与盾的激烈碰撞

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/693099

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX