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