多语言展示
当前在线:261今日阅读:113今日分享:31

java web项目怎么加密url上的参数

jsp url 参数加密传送的终极解决方案
方法/步骤
1

Java.NET.URLEncoder.encode(Base64编码(加密字串),StringCode) 这样的方法来对url中的参数进行加密。

2

一、算法的选择:对于url中参数进行加密的过程,我不建议使用RSA或者是三重DES这样的加密算法,主要原因在于性能和速度会受影响。我建议大家使用对称加密如:DES或者是PBE算法。我们在这边就使用PBEWithMD5AndDES来实现加密。

3

二、加密原理对于一个纯文本,加密后它会变成一堆乱码,这堆乱码包括了许多非法字符,我们不希望把这些字符放入bean中,因此在加密完后,我们还要对加密结果进行base64编码。PBE从字面上理解,它必须使用一个口令,我们不希望我们的加密过于复杂而影响页面跳转的速度,因此我们不采用口令+KEY的形式,我们这边的口令就是我们的KEY。因此,我们的整个加密过程实现如下:输入口令(KEY)--> 加密文本 --> 以base64对加密后的结果进行编码-->以java.Net.URLEncoder.encode编码成浏览器可以识别的形式-->传输给接受的action。而解密过程如下:接受的action得到参数-->以base64对结果进行解码-->得到纯加密文本-->解密-->得到解密后的值。

4

三、BASE64这边对于BASE64的原理不多说了,只说实现,目前网上有很多实现方式,有自己写的,有用sun.misc.*的,我们在这个例子里将使用javax.mail.internet.MimeUtility自带的base64编码工具。需要引入activation.jar和mail.jar两个包。下面是具体的实现:

5

四、加密解密工具类的实现有了BASE64的工具类,下面的工作将变得简单了,编写我们的加密解密工具类吧:

6

注意上面加粗的三处地方:private final static int ITERATIONS = 20;上面的值越大,加密越深,一般例子都以'Java安全性编程指南”这本书中的例子的值为准,设成1000,我们在这边只需要20就够了,原因就是考虑到加解密的速度问题。int saltLength = 12;这是base64解码后源的长度,加密后再经BASE64编码后源的长度为8,BASE64解码后源的长度为12,至于为什么,这也是根据BASE64的原理得出的,具体可以看BASE64原理,网上很多,说得也都很简单。PBEWithMD5AndDES我们使用的是PBEWithMD5AndDES加密。

7

五、工具类在struts action中的具体使用

8

六、jsp页面中的encode把上述这个bean放入request中,带到下一个jsp页面中后,在jsp页面的处理如下:

9

七、在接受加密参数的action中对加密的值进行解密我们假设我们的接受的action为: queryMyTask.do,它接受一系列的参数,基中,processDefId和processImgPath是加密的。

10

八、key(口令)的存放因为我们这边的key就是口令,是一个文本,我们将它存放在server端的properties中,当然,我们也是加密存放的。我们使用spring+jasypt1.5(Java simple encrypt包)。设我们有一个properties文件,其中:security.des.key=ENC(OlO0LqELUuLOVreCtDngHaNgMcZWUyUg)这个就是我们在encrypt和decrypt方法中用到的key。我们不希望这个key以明文的形式设在properties中,我们对这个key再进行一次加密用的同样也是PBEWithMD5AndDES,当然因为有了spring因为有了jasypt包,因此这个过程一切是自动的。我们使用jasypt包下的bin中自带的encrypt.bat工具:encrypt input=mykey password=secret algorithm=PBEWithMD5AndDES该命令会输出一行乱码,把这行乱码复制到properties文件中,在外层加上ENC(),如:生成: OlO0LqELUuLOVreCtDngHaNgMcZWUyUg放入properties后需要转换成: ENC(OlO0LqELUuLOVreCtDngHaNgMcZWUyUg)然后在工程部署的机器上需要设一个环境变理,如:set APP_ENCRYPTION_PASSWORD=secret   此处的值必须和上面encrypt.bat命令行中的password=后的值一样。(Linux请用export APP_ENCRYPTION_PASSWORD=secret)然后配置spring,使该properties在工程被app 容器load时,自动解密,这样我们在我们的方法中直接取到该KEY时就已经是明文了(解密过程是jasypt+spring自动完成的),以下是这一步配置的详细内容:

11

九、注意Exception in thread 'main' java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream如果你用myEclipse进行开发的话,运行时可能会出现以下的错误:Exception in thread 'main' java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream原因是jar包版本不统一,解决方法如下:删除Java EE 5 Libraries/javaee.jar/mail里的包有东西.具体方法如下:用rar打开D:\MyEclipse8.6\Genuitec\Common\plugins\com.genuitec.eclipse.j2eedt.core_8.6.0.me2\data\libraryset\EE_5\javaee.jar,然后删除mail,一切就ok了。

推荐信息