软件的License控制大概中涉及几个问题:
加密算法问题
License有效性问题
关于加密算法当然选择余地非常大,精益求精,要方便的有许多现有的高强度的算法,如DES,AES,RAS,MD5,有对称算法和公钥算法。
一般在软件加密中用对称算法,当然,在License(或密码)的分发中可能用到公钥算法。
License分发一般用拷贝License文件的方式分发,License分发管理不是问题。
加密算法是公开的,有很多开源实现这些算法。
关于License有效性,主要有两方面:
一是License身份有效性,这个License是给指定分发对象,别人不可用。
可以通过收集用户的注册信息和不变的硬件信息,如用户的硬盘信息,CPU信息,这些信息要求别人无法伪造,作为用户身份标志。
二是License时间有效性问题,这尤其在试用License中。
这个问题,我一直没有想到一个特别好的,比较严谨的解决办法。
现在了解到的大概有这么一些方案:
1. 记录第一次使用的时间T1,第i次开始使用时间T_i_begin,第i次结束使用时间T_i_end,在第i+1次使用时T_current判断:
flag = T1 <= T_i_begin && T_i_begin <= T_i_end && T_i_end <= T_current && T_current <= T_valid
flag = true,通过验证
T_valid 为失效时间。
这一方案的漏洞是:用户仍可以用修改系统时间的方式延长使用,用户在i+1次用时可以把系统时间改为T_i_end,flag=true。
假设试用期为30天,如果用户每天用一个小时,极限的情况最多可以用24*30天。
2。1方案的问题的关键是在用户打开软件使用是如何取到一个准确的或近似准确的系统时间(容许差异12小时)。
比如,系统中是否有些文件的的时间戳是每天更新或者注册表中有时间戳,又不会因为用户修改系统时间而改变时间戳?
(不清楚?)
或者修改系统时间有事件LOG记录,那么可以解析该LOG,证明时间是被篡改了。
(也不清楚?)
与时间服务器同步,这是一个很好的也容易的解决方案,如果应用平台一直可靠的处于online状态,那么,离线或网络故障呢?
License的时间有效性控制,你有好的想法和建议吗?
加密算法问题
License有效性问题
关于加密算法当然选择余地非常大,精益求精,要方便的有许多现有的高强度的算法,如DES,AES,RAS,MD5,有对称算法和公钥算法。
一般在软件加密中用对称算法,当然,在License(或密码)的分发中可能用到公钥算法。
License分发一般用拷贝License文件的方式分发,License分发管理不是问题。
加密算法是公开的,有很多开源实现这些算法。
关于License有效性,主要有两方面:
一是License身份有效性,这个License是给指定分发对象,别人不可用。
可以通过收集用户的注册信息和不变的硬件信息,如用户的硬盘信息,CPU信息,这些信息要求别人无法伪造,作为用户身份标志。
二是License时间有效性问题,这尤其在试用License中。
这个问题,我一直没有想到一个特别好的,比较严谨的解决办法。
现在了解到的大概有这么一些方案:
1. 记录第一次使用的时间T1,第i次开始使用时间T_i_begin,第i次结束使用时间T_i_end,在第i+1次使用时T_current判断:
flag = T1 <= T_i_begin && T_i_begin <= T_i_end && T_i_end <= T_current && T_current <= T_valid
flag = true,通过验证
T_valid 为失效时间。
这一方案的漏洞是:用户仍可以用修改系统时间的方式延长使用,用户在i+1次用时可以把系统时间改为T_i_end,flag=true。
假设试用期为30天,如果用户每天用一个小时,极限的情况最多可以用24*30天。
2。1方案的问题的关键是在用户打开软件使用是如何取到一个准确的或近似准确的系统时间(容许差异12小时)。
比如,系统中是否有些文件的的时间戳是每天更新或者注册表中有时间戳,又不会因为用户修改系统时间而改变时间戳?
(不清楚?)
或者修改系统时间有事件LOG记录,那么可以解析该LOG,证明时间是被篡改了。
(也不清楚?)
与时间服务器同步,这是一个很好的也容易的解决方案,如果应用平台一直可靠的处于online状态,那么,离线或网络故障呢?
License的时间有效性控制,你有好的想法和建议吗?