hack过几个Java的程序,发现他们的生产license key的方法几乎都一样,难道是用了什么library。大家的通用方法就是把用户信息用key=value的形式弄成一个文本,然后用privatekey签名。程序里面就是一个public key,验证这个签名。有趣的是,大家都会用GZIP之类的方式压缩,然后再Base64。可以反思一下怎么样更好的防止hack。。

keygen很简单,覆盖掉public key:
keytool -genkeypair -keyalg DSA -alias mykey -keystore k.jks
keytool -exportcert -keystore k.jks -alias mykey -file ccc.cer

然后,Keygen using groovy:

import java.util.zip.*
import java.security.*
import java.security.cert.*

str="""email=who@know.com
issueDate=19/09/2013
maintenanceYears=99
quantity=99
registeredTo=Joe Doe
"""

KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("k.jks"), "hahaha".toCharArray())
 KeyStore.ProtectionParameter protParam =
        new KeyStore.PasswordProtection("hahaha".toCharArray());
def pk = pkEntry = ks.getEntry("mykey", protParam).getPrivateKey();
Signature s = Signature.getInstance("SHA1withDSA")
s.initSign(pk)
s.update(str.getBytes())
sig = s.sign().encodeBase64()

o=new ByteArrayOutputStream()
m=new GZIPOutputStream(o)
full = str + "__signature__=" + sig + "\n"
println full
m.write(full.getBytes())
m.close()
b=o.toByteArray().encodeBase64()
println b