1、先对程序进行完整性校验,采用MD5算法较好,确保执行程序不会被修改,将MD5结果作为第一部分。
2、收集本机信息(网卡、硬盘、CPU信息、当前日期,注册用户等信息),采用3DES算法加密,将加密结果作为第二部分进行保存。
3、将两部分结果进行合并,通过网络或者其他途径传送给服务器,服务器先判断程序的完整性,如果完整,则解密客户机信息,通过RSA算法使用私钥进行加密,将秘文发还给客户。
4、客户使用收到的秘文以及程序中包含的RSA算法的公钥进行解密并进行本机校验,如果信息正确则可以继续运行,否则失败。
这个加密方法的特点是不怕用户知道你的加密方法(当然私钥一定要藏好),并且加密强度相当高,大约112位,一般的打狗方法是不能奏效的。上面提及的算法在网络上都可以找到,会费些心思。
我是把注册算法,实际代码,无用的代码写在一起(不是调用函数),然后注册失败也不提示,有上百个验证点,也是直接写在实际代码中,算法到没有什么就是特别长,等他把代码看懂,至少要死掉一半脑细胞。
总结 + 补充
1) 用那些经过全世界最优秀的密码分析学家们分析过也不能解密的算法
2) 加上CRC校验,一旦发现被修改,不要马上提示最好几天甚至几星期后再不工作
3) 无论注册失败或成功都不提示
4) 实际代码,无用的代码写在一起, 分多步验证
5) Write email to the webmaster of the crack site
6) 升级后改变算法[?!]
补充一点,我想到的一个简单易行的办法,可以加大破解难度
7) 注册码的判断分两个函数,两个标志,在注册码的输入窗体中,只判断注册码的前一部分,使用Func1()判断,注册用户输入正确注册码时并不会感到异常,而破解者通常会在此窗口中追踪代码,就算破解了,在此出破解通过的只是一部分算法而已,但要让他自以为成功了,通过后标志1为真,About窗口显示成功注册了。然后在程序的另一部分使用完整的判断函数Func2()判断.这里不给出任何提示,如果对了才把标志2设为真,也就是说用假的注册码可以注册成功,但运行到关键的地方就出问题了,程序重新启动时再用Func1()判断,Cracker查看ABOUT,显示成功注册给xxx,但关键的地方就是不能用,嘿嘿,够黑吧。
注册码输入框的最大输入长度设为8位(但注册码长度其实是从10位至40位不固定,视用户机器码而定)
注册码在输入时,每输入一次,判断已输入的前N字符,是不是前N位都是正确的注册码值的前N位,如果不是,则将注册码输入框的最大长度锁死在八位。
如果是粘贴上的注册码,采用剪切版内容查看等方法进行判断。
注意最好不要逐字比较,要全文比较,否则好跟踪。
然后有人会以为注册码是8位。
如果判断输入8位后,调用另外一个很复杂但没用的算法(算法A),生成一个8位的注册码(注册码A)。
如果有人添入“注册码A”试图注册,这个人肯定是破解者,而且破解成功了你的“算法A”,此时,该怎么做你知道了吧。