URL加密解密完整解决方案
常见网页加密方法和破解对策
常见网页加密方法和破解对策[dvnews_page]常见网页加密方法和破解对策(一)右键弹出窗口加密。
程序如下:<script language=“JavaScript”><!--document.onmousedown=clickfunction click() {if ( event.button==2) {alert(‘不准查看源文件’) }if ( event.button==3) {alert(‘不准查看源文件’) }}//-->aScript”><!--document.onmousedown=clickfunction click() {{window.location=“index.html”; alert(‘不准查看源文件’); }}//--></script>由于在NC中无法定义左右键,只有加上window.location=“index.html”令其一旦激活鼠标事件就转向首页或其它Web页,否则在NC中右键按了“确定”后,还会弹出快捷菜单。
缺点是在IE5.0左键也被禁止,不过在NC4.5只要按在链接上,仍能正常转向Web页。
用乱码显示链接、调用地址加密。
利用某些函数把URL字符转换成ASCII码,从而达到隐藏链接Frame页面和*.js,*.asp等脚本的目的。
返回ASCII码escape(character),ASCII码为%XX格式,XX是十六进制,如空格键为%20。
返回字符unEscape(string)如:<!—var Words=“ %3Cframeset%20BORDER%3D%220%22%20FRAMEBORDER%3D%220%22 %20FRAMESPACING%3D%220%22%20rows%3D%22100%25%22%3E%0D%0A%20%20%3Cfram e%20SRC%3D%22http%3A///XXX/XXX/%22%20NAME%3D%22oos1%22%20”// --></script>我们只要运行以下语句,可还原“乱码”<script LANGUAGE=“JAVASCRIPT”>var Words=“乱码”document.write(unescape(Words))</script>什么??没有输出!呵呵,原乱码是完整的JavaScript语句,当然不能显示,把%3C删去破坏其格式,输出frameset BORDER=“0” FRAMEBORDER=“0” FRAMESPACING=“0” rows=“100%”> 再把下一个%3C删去,所有字符都出来了哦。
url安全解决方案
URL安全解决方案1. 概述URL(Uniform Resource Locator)是用于定位资源的字符串。
在互联网应用程序中,URL被广泛使用来传递参数、定位资源和跳转页面等。
然而,URL安全性问题是一个常见的网络安全威胁。
攻击者可以通过修改URL参数、注入恶意代码或进行其他恶意行为来导致安全漏洞。
为了保护应用程序和用户的安全,我们需要实施URL安全解决方案。
本文将介绍一些常见的URL安全问题,并提供相关的解决方案,以保护应用程序和用户的安全。
2. URL安全问题2.1 参数篡改参数篡改是指攻击者通过修改URL中的参数来实现攻击目的。
例如,攻击者可以修改URL中的商品ID,以获取未授权的信息或访问受限资源。
2.2 注入攻击URL注入攻击是一种常见的安全漏洞,攻击者通过在URL中注入恶意代码来执行恶意操作。
例如,攻击者可以在URL参数中注入SQL语句,以获取或修改数据库中的数据。
2.3 CSRF攻击CSRF(Cross-Site Request Forgery)攻击是指攻击者通过伪造用户的请求,实现非法操作。
攻击者可以通过构造包含恶意URL的页面,诱使用户访问并执行非法操作,如修改用户信息、发起转账等。
2.4 XSS攻击XSS(Cross-Site Scripting)攻击是指攻击者通过在URL参数中注入恶意脚本代码,实现对用户浏览器的控制。
一旦用户访问包含恶意URL的页面,恶意脚本代码将在用户浏览器中执行,攻击者可以窃取用户的敏感信息或进行其他恶意操作。
3. URL安全解决方案为了解决URL安全问题,可以采取以下措施:3.1 参数校验在服务端对URL参数进行严格校验,包括长度、格式和值的合法性等。
对于需要权限控制的参数,还可以检查用户的权限是否足够。
如果发现异常或非法参数,可以拒绝处理请求或返回错误信息。
3.2 参数加密对于敏感的URL参数,可以在传输过程中进行加密。
可以使用对称加密算法或非对称加密算法对参数进行加密,并在服务端进行解密。
URL加密解密
string ID = System.Text.Encoding.Default.GetString(Convert.FromBase64String(Request.QueryString["id"].ToString().Replace("%2B","+")));
public class TestCode {
public static void main(String[] args) {
String str="你好吗";
try {
//将 String 转换为 application/x-www-form-urlencoded MIME 格式
response.sendRedirect(loginForm.getUrl()+"&username=" + encodeUserName + "&onlines=" + onlines);
}else{
response.sendRedirect("welcome.do");
String fullUrl = uri.toString() + "?" + queryStr;
String decodeStr=.URLDecoder.decode(fullUrl, "UTF-8");//这个就是按照utf-8格式解密的方法
%>
System.out.println("codestr:"+codestr);
decodeStr=.URLDecoder.decode(codestr, "gb18030");
URL参数加密解密
URL参数加密解密在Web开发中,为了传递参数,通常会将参数附加在URL中。
然而,有时候我们需要对敏感信息进行加密,以保护用户的隐私和安全。
在这种情况下,URL参数加密就变得很重要。
1. Base64加密:Base64是一种基于64个字符的编码方法,它可以将二进制数据转换为可打印字符。
使用Base64加密,可以将参数数据转换成一串不可读的字符。
在接收端,再进行解码,还原成原始的参数数据。
2.对称加密算法:对称加密算法使用相同的密钥进行加密和解密。
常见的对称加密算法有DES、AES和RC4等。
使用对称加密算法,我们可以将参数数据进行加密,然后将密文作为URL参数传输。
接收端再使用相同的密钥进行解密,还原成原始的参数数据。
3.非对称加密算法:非对称加密算法使用两个密钥,一个是公钥,一个是私钥。
公钥用于加密数据,私钥用于解密数据。
使用非对称加密,我们可以将参数数据使用公钥进行加密,然后将密文作为URL参数传输。
接收端使用私钥进行解密,还原成原始的参数数据。
4. Hash算法:Hash算法是一种将数据转换成固定长度摘要的算法。
常见的Hash算法有MD5、SHA-1和SHA-256等。
使用Hash算法,我们可以将参数数据进行Hash运算,得到一个摘要值。
然后将该摘要值作为URL参数传输。
接收端也进行相同的Hash运算,比对两个摘要值是否一致,从而验证参数数据的完整性。
不论使用哪种URL参数加密方法,我们都需要在传输过程中保证密钥的安全。
如果密钥被黑客截取,他们就可以轻松地解密参数数据,这将对用户的隐私和安全造成威胁。
因此,在使用URL参数加密时,需要注意密钥的保护,可以使用HTTPS协议进行传输,以确保传输的安全性。
另外,使用URL参数加密还需要考虑性能和效率。
加密和解密过程通常会增加系统的开销,因此需要谨慎地选择加密算法和密钥长度,以平衡安全性和性能的需求。
总结起来,URL参数加密是一种保护用户隐私和安全的重要手段。
url参数加密和解密 简书
URL 参数的加密和解密主要涉及到的知识点包括基本的加密解密方法(例如,AES,RSA 等)、数据编码/解码等。
以下是简书的一个基本例子,这个例子使用了 AES 加密和解密:首先,你需要安装 pycryptodome 这个库,可以通过 pip 安装: ```pip install pycryptodome```然后,你可以使用以下代码进行 AES 加密和解密:```pythonfrom Crypto.Cipher import AESfrom Crypto.Util.Padding import pad, unpadfrom Crypto.Random import get_random_bytesimport base64def encrypt_aes(data, key):cipher = AES.new(key, AES.MODE_CBC) # 创建一个新的cipher对象# 确保数据长度是16的倍数,如果不是,则使用PKCS7进行填充padded_data = pad(data.encode('utf-8'), AES.block_size)encrypted_data = cipher.encrypt(padded_data) # 加密数据iv = cipher.iv # 获取初始化向量# 将初始化向量和加密后的数据编码为base64字符串以便于传输return base64.b64encode(iv + encrypted_data).decode('utf-8')def decrypt_aes(encrypted_data, key):# 解码base64字符串以获取初始化向量和加密后的数据iv_encrypted_data = base64.b64decode(encrypted_data) iv = iv_encrypted_data[:AES.block_size] # 获取初始化向量cipher = AES.new(key, AES.MODE_CBC, iv=iv) # 使用初始化向量创建一个新的cipher对象decrypted_data = unpad(cipher.decrypt(iv_encrypted_data[AES.block_size:]), AES.block_size) # 解密数据并去除填充return decrypted_data.decode('utf-8') # 返回解密后的字符串```使用示例:```pythonkey = get_random_bytes(16) # 生成一个随机的16字节密钥data = 'Hello, world!' # 需要加密的数据encrypted = encrypt_aes(data, key) # 加密数据print('Encrypted:', encrypted) # 打印加密后的数据decrypted = decrypt_aes(encrypted, key) # 解密数据print('Decrypted:', decrypted) # 打印解密后的数据,应该和原始数据相同```。
URL地址编码和解码
URL地址编码和解码0. 参考1.2.1. The main parts of URLsA full BNF description of the URL syntax is given in Section 5.In general, URLs are written as follows:<scheme>:<scheme-specific-part>A URL contains the name of the scheme being used (<scheme>) followedby a colon and then a string (the <scheme-specific-part>) whoseinterpretation depends on the scheme.Scheme names consist of a sequence of characters. The lower caseletters "a"--"z", digits, and the characters plus ("+"), period("."), and hyphen ("-") are allowed. For resiliency, programsinterpreting URLs should treat upper case letters as equivalent tolower case in scheme names (e.g., allow "HTTP" as well as "http").注意字母不区分⼤⼩写2. python22.11 >>> import urllib2 >>> url = 'http://web '3 >>> url_en = urllib.quote(url) #空格编码为“%20”4 >>> url_plus = urllib.quote_plus(url) #空格编码为“+”5 >>> url_en_twice = urllib.quote(url_en)6 >>> url7'http://web '8 >>> url_en9'http%3A//web%'10 >>> url_plus11'http%3A%2F%2Fweb+'12 >>> url_en_twice13'http%253A//web%'#出现%25说明是⼆次编码14#相应解码15 >>> urllib.unquote(url_en)16'http://web '17 >>> urllib.unquote_plus(url_plus)18'http://web '2.2 URL含有中⽂1 >>> import urllib2 >>> url_zh = u'/tag/美国'3 >>> url_zh_en = urllib.quote(url_zh.encode('utf-8')) #参数为string4 >>> url_zh_en5'http%3A///tag/%E7%BE%8E%E5%9B%BD'6 >>> print urllib.unquote(url_zh_en).decode('utf-8')7 /tag/美国3. python33.11 >>> import urllib2 >>> url = 'http://web '3 >>> url_en = urllib.parse.quote(url) #注意是urllib.parse.quote4 >>> url_plus = urllib.parse.quote_plus(url)5 >>> url_en6'http%3A//web%'7 >>> url_plus8'http%3A%2F%2Fweb+'9 >>> urllib.parse.unquote(url_en)10'http://web '11 >>> urllib.parse.unquote_plus(url_plus)12'http://web '3.2 URl含中⽂1 >>> import urllib2 >>> url_zh = '/tag/美国'3 >>> url_zh_en = urllib.parse.quote(url_zh)4 >>> url_zh_en5'http%3A///tag/%E7%BE%8E%E5%9B%BD'6 >>> urllib.parse.unquote(url_zh_en)7'/tag/美国'4. 其他1 >>> help(urllib.urlencode)2 Help on function urlencode in module urllib:34 urlencode(query, doseq=0)5 Encode a sequence of two-element tuples or dictionary into a URL query string. 67 If any values in the query arg are sequences and doseq is true, each8 sequence element is converted to a separate parameter.910 If the query arg is a sequence of two-element tuples, the order of the11 parameters in the output will match the order of parameters in the12 input.1314 >>>。
url加密方法
url加密方法一、背景介绍随着互联网的发展,越来越多的信息被传输到网络上,保护数据的安全性成为了互联网安全的重要问题。
其中,url加密方法是一种常见的加密方式,可以有效地保护数据的安全性。
本文将详细介绍url加密方法及其实现步骤。
二、url加密方法1.对称加密算法对称加密算法是一种常见的url加密方法,它使用相同的密钥进行加解密操作。
其中,DES、AES、RC4等都是常见的对称加密算法。
其实现步骤如下:(1)选择一个合适的对称加密算法。
(2)生成一个随机数作为秘钥。
(3)使用秘钥对需要传输的数据进行加密操作。
(4)将秘钥和加密后的数据发送给接收方。
(5)接收方使用秘钥对数据进行解密操作。
2.非对称加密算法非对称加密算法是另一种常见的url加密方法,它使用公共和私有两个不同的秘钥进行加解密操作。
其中,RSA是最常用的非对称加密算法之一。
其实现步骤如下:(1)生成公共和私有两个不同的秘钥。
(2)将公共秘钥发送给需要传输数据的接收方。
(3)使用私有秘钥对需要传输的数据进行加密操作。
(4)将加密后的数据发送给接收方。
(5)接收方使用公共秘钥对数据进行解密操作。
3.哈希加密算法哈希加密算法是一种常见的url加密方法,它将任意长度的消息压缩成一个固定长度的摘要信息。
其中,MD5、SHA-1、SHA-2等都是常见的哈希加密算法。
其实现步骤如下:(1)选择一个合适的哈希加密算法。
(2)将需要传输的数据进行哈希运算。
(3)将哈希值作为url中的参数传输给接收方。
(4)接收方使用相同的哈希算法对数据进行哈希运算,并将结果与发送方传输过来的结果进行比较。
三、url加密方法实现步骤1.对称加密算法实现步骤(1)选择一个合适的对称加密算法,如AES。
(2)生成一个随机数作为秘钥,可以使用Java中提供的SecureRandom类生成随机数。
(3)使用秘钥对需要传输的数据进行加密操作,可以使用Java中提供的Cipher类实现AES算法。
java进阶12Base64UrlBase64Hex加密解密技术
java进阶12Base64UrlBase64Hex加密解密技术 java的加密与解密技术: 现在的加密技术主要有 单向加密算法:以MD5 SHA算法为代表 对称加密算法:以DES 三重DES AES PBE算法为代表 ⾮对称加密算法:以RSA为代表 简要的说下这三种加密算法的区别 先是单向加密算法,顾名思义,它不会有密钥,因为它是单向的,加密之后⽆法解密,就连程序猿都⽆法知道加密之后的东西是什么 主要⽤处是数据完整性的验证。
对称加密算法,其特征是公钥与私钥相同。
⼀般⽤来数据储存,⽐如将数据加密之后存⼊数据库,那么数据库管理员就⽆法泄密数据库中的类容 有密钥的⼈却可以根据密钥解密数据库中的真正数据。
⾮对称加密算法,就是公钥与私钥不同,⼀般公钥公开,私钥在你想给⼈看到数据的⼈的⼿上,利⽤私钥来解密数据。
它⼀般是⽤于数据传输的加密。
先由浅⼊深,先说说伪加密 Base64 UrlBase64 Hex ⾸先java api中没有实现这三个类,所以你需要下载jar包。
就是这2个。
先来说说Base64吧。
新建它的类。
package Cipher;import org.bouncycastle.util.encoders.Base64;public class Base64Coder {/** 经Base64编码后的字符串的字符数是以4为单位的整数倍* */public final static String ENCODING="UTF-8";//加密public static String encode(String data) throws Exception{byte[] b=Base64.encode(data.getBytes(ENCODING));//执⾏编码return new String(b,ENCODING);}//解密public static String decode(String data) throws Exception{byte[] b=Base64.decode(data.getBytes(ENCODING));//解密编码return new String(b,ENCODING);}} 然后在主函数中运⾏下。
php实现URL加密解密的方法
php实现URL加密解密的⽅法本⽂实例讲述了php实现URL加密解密的⽅法。
分享给⼤家供⼤家参考,具体如下:<html xmlns="/1999/xhtml" lang="zh-CN"><head><meta http-equiv="content-type" content="text/html; charset=gb2312" /><meta http-equiv="content-language" content="zh-CN" /><meta http-equiv="pragma" content="no-cache" /><meta http-equiv="expires" content="0" /><meta http-equiv="MSThemeCompatible" content="Yes" /><meta http-equiv="imagetoolbar" content="no" /><meta http-equiv="widow-target" content="_top" /><meta name="robots" content="index, follow" /><meta name="author" content="3945, [email]ljm77@[/email]" /><meta name="keywords" content="" /><meta name="description" content="" /><meta name="copyright" content="Copyright 3945 All Rights Reserved" /><title>⽆标题⽂档</title><style type="text/css"><!--a, a:link{text-decoration: none; color:#000000; font-size:9pt;} a:visited{text-decoration: none; color:#000000;} a:hover{text-decoration: underline; color:red;} body, td, p, li, div, select{font-size:9pt; font-family:"宋体";}--></style></head><body><?phpfunction query_encode($sQuery){//加密链接if(strlen($sQuery)==0){return '';}else{$s_tem = preg_replace("/&/i", '&', $sQuery);$s_tem = preg_replace("/&/i", '&', $s_tem);$a_tem = explode('&', $s_tem);shuffle($a_tem);$s_tem = implode('&', $a_tem);$s_tem = rawurlencode($s_tem);$s_tem = base64_encode($s_tem);$s_tem = strrev($s_tem);return $s_tem;}}function query_decode($sEncode){//解密链接if(strlen($sEncode)==0){return '';}else{$s_tem = strrev($sEncode);$s_tem = base64_decode($s_tem);$s_tem = rawurldecode($s_tem);return $s_tem;}}function rebuild_GET(){//重写$_GET全局变量$_GET = array();$s_query = $_SERVER['QUERY_STRING'];if(strlen($s_query)==0){return;}else{$s_tem = query_decode($s_query);$a_tem = explode('&', $s_tem);foreach($a_tem as $val){$tem = explode('=', $val);$_GET[$tem[0]] = $tem[1];}}}rebuild_GET();echo 'GET:<pre>'.print_r($_GET, true).'</pre>';function testGET(){echo 'Function GET:<pre>'.print_r($_GET, true).'</pre>';}testGET();><br /><br /><br /><?for($i=1; $i<10; $i++){$s_url = query_encode('ac=index:logo& style="color: #007700">.$i);echo sprintf('<a href="?%s">TEST: %s</a><br />', $s_url, $s_url);}></body></html>PS:关于加密解密感兴趣的朋友还可以参考本站在线⼯具:更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》、《》、《》、及《》希望本⽂所述对⼤家PHP程序设计有所帮助。
URL加密解密完整解决方案
URL加密解密完整解决方案采用:.URLEncoder.encode(Base64编码(加密字串), StringCode) 这样的方法来对url中的参数进行加密。
首先我们先说一下如何加密。
一、算法的选择:对于像对url中的参数进行加密的过程,我不建议使用rsa或者是三重des这样的加密算法,主要原因在于性能和速度会受影响。
我建议大家使用对称加密如:DES或者是PBE算法。
我们在这边就使用PBEWithMD5AndDES来实现加密。
二、加密原理对于一个纯文本,加密后它会变成一堆乱码,这堆乱码包括了许多非法字符,我们不希望把这些字符放入bean中,因此在加密完后,我们还要对加密结果进行base64编码。
PBE从字面上理解,它必须使用一个口令,我们不希望我们的加密过于复杂而影响页面跳转的速度,因此我们不采用口令+KEY的形式,我们这边的口令就是我们的KEY。
因此:我们的整个加密过程实现如下:输入口令(KEY)--> 加密文本 --> 以base64对加密后的结果进行编码-->以.URLEncoder.encode编码成浏览器可以识别的形式-->传输给接受的action而解密过程如下:接受的action得到参数-->以base64对结果进行解码-->得到纯加密文本-->解密-->得到解密后的值三、BASE64这边对于BASE64的原理不多说了,只说实现,目前网上有很多实现方式,有自己写的,有用sun.misc.*的,我们在这个例子里将使用javax.mail.internet.MimeUtility自带的base64编码工具。
需要引入activation.jar和mail.jar两个包。
下面是具体的实现:import javax.mail.internet.MimeUtility;public class Base64 {public static byte[] encode(byte[] b) throws Exception {ByteArrayOutputStream baos = null;OutputStream b64os = null;try {baos = new ByteArrayOutputStream();b64os = MimeUtility.encode(baos, "base64");b64os.write(b);b64os.close();return baos.toByteArray();} catch (Exception e) {throw new Exception(e);} finally {try {if (baos != null) {baos.close();baos = null;}} catch (Exception e) {}try {if (b64os != null) {b64os.close();b64os = null;}} catch (Exception e) {}}}public static byte[] decode(byte[] b) throws Exception { ByteArrayInputStream bais = null;InputStream b64is = null;try {bais = new ByteArrayInputStream(b);b64is = MimeUtility.decode(bais, "base64");byte[] tmp = new byte[b.length];int n = b64is.read(tmp);byte[] res = new byte[n];System.arraycopy(tmp, 0, res, 0, n);return res;} catch (Exception e) {throw new Exception(e);} finally {try {if (bais != null) {bais.close();bais = null;}} catch (Exception e) {}try {if (b64is != null) {b64is.close();b64is = null;}} catch (Exception e) {}}}}四、加密解密工具类的实现有了BASE64的工具类,下面的工作将变得简单了,编写我们的加密解密工具类吧:import java.io.DataOutputStream;import java.io.FileOutputStream;import java.security.*;import javax.crypto.*;import javax.crypto.spec.*;import java.util.*;import mons.logging.Log;import mons.logging.LogFactory;public class SecurityHelper {protected final static Log logger = LogFactory.getLog(SecurityHelper.class);private final static int ITERATIONS = 20;public static String encrypt(String key, String plainText) throws Exception {String encryptTxt = "";try {byte[] salt = new byte[8];MessageDigest md = MessageDigest.getInstance("MD5");md.update(key.getBytes());byte[] digest = md.digest();for (int i = 0; i < 8; i++) {salt[i] = digest[i];}PBEKeySpec pbeKeySpec = new PBEKeySpec(key.toCharArray());SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");SecretKey skey = keyFactory.generateSecret(pbeKeySpec);PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATIONS); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");cipher.init(Cipher.ENCRYPT_MODE, skey, paramSpec);byte[] cipherText = cipher.doFinal(plainText.getBytes());String saltString = new String(Base64.encode(salt));String ciphertextString = new String(Base64.encode(cipherText));return saltString + ciphertextString;} catch (Exception e) {throw new Exception("Encrypt Text Error:" + e.getMessage(), e);}}public static String decrypt(String key, String encryptTxt)throws Exception {int saltLength = 12;try {String salt = encryptTxt.substring(0, saltLength);String ciphertext = encryptTxt.substring(saltLength, encryptTxt.length());byte[] saltarray = Base64.decode(salt.getBytes());byte[] ciphertextArray = Base64.decode(ciphertext.getBytes());PBEKeySpec keySpec = new PBEKeySpec(key.toCharArray());SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");SecretKey skey = keyFactory.generateSecret(keySpec);PBEParameterSpec paramSpec = new PBEParameterSpec(saltarray,ITERATIONS);Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");cipher.init(Cipher.DECRYPT_MODE, skey, paramSpec);byte[] plaintextArray = cipher.doFinal(ciphertextArray);return new String(plaintextArray);} catch (Exception e) {throw new Exception(e);}}注意上面加粗的三处地方:private final static int ITERATIONS = 20;上面的值越大,加密越深,一般例子都以"Java安全性编程指南”这本书中的例子的值为准,设成1000,我们在这边只需要20就够了,原因就是考虑到加解密的速度问题。
URL参数加密解密
URL参数加密解密在Web开发中,URL参数加密和解密是一种常见的安全技术,用于保护敏感数据在传输过程中的安全性。
URL参数加密的主要目的是防止恶意用户获取和篡改敏感数据,从而提高系统的安全性。
本篇文章将详细介绍URL参数加密和解密的原理、常用的加密算法以及在实际项目中实现的一些注意事项。
一、URL参数加密和解密原理1.在客户端,将需要加密的参数经过加密算法加密为密文。
2.将密文作为参数的值,拼接到URL中。
3.在服务器端,通过解密算法对密文进行解密,获取原始的参数值。
二、URL参数加密的常用算法在实际项目中,URL参数加密一般使用对称加密算法或者非对称加密算法。
常用的对称加密算法有AES和DES,常用的非对称加密算法有RSA。
1.对称加密算法对称加密算法是指加密和解密使用相同的密钥的加密算法。
AES (Advanced Encryption Standard)和DES(Data Encryption Standard)是目前使用最广泛的对称加密算法。
AES算法的优点是安全性高、速度快,适合在实际项目中使用。
DES算法的优点是简单、速度较快,但安全性相对较低。
2.非对称加密算法非对称加密算法是指加密和解密使用不同的密钥的加密算法。
RSA (Rivest, Shamir和Adleman)是目前使用最广泛的非对称加密算法。
RSA算法的优点是安全性高、可解决密钥管理问题。
但由于其加密和解密的速度较慢,一般用于对称加密算法密钥的加密和解密。
三、URL参数加密解密的具体实现1.引入加密算法所需的依赖在使用Java语言和Spring框架进行URL参数加密解密前,需要引入相应的加密算法所需的依赖。
比如,使用AES算法需要引入BouncyCastle库(通过Maven配置):```xml<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.65</version></dependency>```2.编写加密算法的工具类在Java语言中,可以通过Cipher类进行加密和解密操作。
破解网源代码加密方法
破解网源代码加密方法破解网站源代码的加密方法是非法而且道德上也是不可取的,因为这样做涉及到侵犯他人的权利和隐私。
此外,破解网站代码可能还会导致网站的安全漏洞,给用户带来损失。
因此,我将不会提供关于破解的任何方法。
然而,我可以告诉你如何保护你自己的代码和网站安全,以防止他人试图破解你的源代码。
1.使用安全的密码:确保你的网站管理后台和数据库密码是强密码并定期更改。
强密码应包含大小写字母,数字和特殊字符,长度至少为8个字符。
2.防止SQL注入攻击:使用预编译语句或ORM框架来处理用户输入,避免直接拼接SQL语句,以防止恶意用户通过输入来执行恶意的SQL代码。
4.防止跨站脚本攻击(XSS):对用户输入的数据进行有效的转义和过滤,以防止恶意脚本被执行。
5.定期更新和升级软件:保持操作系统,服务器软件和CMS等应用程序的最新版本,以修复已知的漏洞。
6.使用SSL证书保护数据传输:在网站上启用SSL加密,以确保用户的敏感数据在传输过程中被加密。
7.使用防火墙和入侵检测系统:部署网络防火墙和入侵检测系统来过滤恶意流量和监控异常行为。
8.加密存储的密码和敏感信息:使用密码哈希函数对密码进行单向加密,并应用适当的加密算法来加密存储的用户数据。
9.加强访问控制:只给予必要的人和角色适当的权限,禁用默认的管理员账户和强制实施双因素认证。
10.定期备份:定期备份你的网站和数据库,并将备份文件存储在安全的地方,以防止数据丢失或被恶意篡改。
总之,更好的方法是保护自己的网站和源代码,而不是试图破解他人的代码。
只有通过合法手段和道德的方法来确保你自己的网站和代码的安全性。
用C#实现DES加密解密解决URL参数明文的问题
⽤C#实现DES加密解密解决URL参数明⽂的问题啥也不说,直接上代码。
加密解码,封装到⼀个类,key可以⾃⼰修改。
using System;using System.Security.Cryptography;using System.Text;using System.IO;namespace Common...{/**//// <summary>/// DESEncrypt加密解密算法。
/// </summary>public sealed class DESEncrypt...{private DESEncrypt()...{//// TODO: 在此处添加构造函数逻辑//}private static string key = "joke168";/**//// <summary>/// 对称加密解密的密钥/// </summary>public static string Key...{get...{return key;}set...{key = value;}}/**//// <summary>/// DES加密/// </summary>/// <param name="encryptString"></param>/// <returns></returns>public static string DesEncrypt(string encryptString)...{byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));byte[] keyIV = keyBytes;byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);DESCryptoServiceProvider provider = new DESCryptoServiceProvider();MemoryStream mStream = new MemoryStream();CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);cStream.Write(inputByteArray, 0, inputByteArray.Length);cStream.FlushFinalBlock();return Convert.ToBase64String(mStream.ToArray());}/**//// <summary>/// DES解密/// </summary>/// <param name="decryptString"></param>/// <returns></returns>public static string DesDecrypt(string decryptString)...{byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));byte[] keyIV = keyBytes;byte[] inputByteArray = Convert.FromBase64String(decryptString);DESCryptoServiceProvider provider = new DESCryptoServiceProvider();MemoryStream mStream = new MemoryStream();CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);cStream.Write(inputByteArray, 0, inputByteArray.Length);cStream.FlushFinalBlock();return Encoding.UTF8.GetString(mStream.ToArray());}}} 欢迎批评指正。
url编码与解码方法
url编码与解码方法摘要:一、URL编码简介二、URL编码方法1.普通字符编码2.特殊字符编码3.中文编码三、URL解码方法四、实战案例与应用五、总结与建议正文:一、URL编码简介URL编码,即统一资源定位符编码,是一种将URL中的一些特殊字符进行编码以便于传输和显示的技术。
URL编码广泛应用于网络编程、数据传输等领域。
了解URL编码方法,对于我们日常编写代码和处理网络数据非常有帮助。
二、URL编码方法1.普通字符编码普通字符编码是指将URL中的英文字母、数字、点号等普通字符直接编码。
常见的编码方式有:- 字母:不需编码,直接使用原始字符。
- 数字:不需编码,直接使用原始字符。
- 点号(.):编码为%,2F(两个字符)- 斜杠(/):编码为%,2F(两个字符)- 冒号(:):编码为%,3A(两个字符)- 等于号(=):编码为%,3D(两个字符)- 问号(?):编码为%,3F(两个字符)2.特殊字符编码URL中还包含一些特殊字符,如空格、井号、双引号等。
这些字符需要进行编码。
常见的编码方式有:- 空格:编码为%,20- 井号(#):编码为%,23- 双引号("):编码为%,22- 单引号("):编码为%,27- 换行符():编码为%,0A3.中文编码在URL编码中,中文字符也需要进行编码。
常见的中文编码方式有:- GBK编码:中文汉字编码,如“你好”编码为%E4%BD%A0%E8%BF%99- UTF-8编码:一种国际通用的编码方式,如“你好”编码为%E4%BD%A0%E8%BF%99三、URL解码方法URL解码就是将经过编码的URL字符串还原成原始的URL。
解码过程中,需要根据编码规则将特殊字符还原成原始字符。
解码方法与编码方法相反,具体如下:1.普通字符解码:直接使用原始字符。
2.特殊字符解码:%-两位数字:将两位数字对应的ASCII码转换为字符。
%-三位数字:将三位数字对应的十六进制字符转换为字符。
URL传输参数加密解密
URL传输参数加密解密最近做⼀个论坛⼊⼝时要实现帐号和密码不在IE地址栏出现⽽做的index.aspx.cs (加密处理)Byte[] Iv64={11, 22, 33, 44, 55, 66, 77, 85};Byte[] byKey64={10, 20, 30, 40, 50, 60, 70, 80};public string Encrypt(string strText){try{DESCryptoServiceProvider des = new DESCryptoServiceProvider();Byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);MemoryStream ms = new MemoryStream();CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey64, Iv64), CryptoStreamMode.Write);cs.Write(inputByteArray, 0, inputByteArray.Length);cs.FlushFinalBlock();return Convert.ToBase64String(ms.ToArray());}catch(Exception ex){return ex.Message;}}private void btnLogin_Click(object sender, System.Web.UI.ImageClickEventArgs e){DateTime nowTime = DateTime.Now;string postUser = txtUser.Text.ToString();string postPass = txtPassword.Text.ToString();Response.Redirect("()));}login.aspx.cs (解密处理)//随机选8个字节既为密钥也为初始向量Byte[] byKey64={10, 20, 30, 40, 50, 60, 70, 80};Byte[] Iv64={11, 22, 33, 44, 55, 66, 77, 85};public string Decrypt(string strText){Byte[] inputByteArray = new byte[strText.Length];try{DESCryptoServiceProvider des = new DESCryptoServiceProvider();inputByteArray = Convert.FromBase64String(strText);MemoryStream ms = new MemoryStream();CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey64, Iv64), CryptoStreamMode.Write);cs.Write(inputByteArray, 0, inputByteArray.Length);cs.FlushFinalBlock();System.Text.Encoding encoding = System.Text.Encoding.UTF8;return encoding.GetString(ms.ToArray());}catch(Exception ex){return ex.Message;}}private void Page_Load(object sender, System.EventArgs e){if(Request.Params["clubID"]!=null){string originalValue = Request.Params["clubID"];originalValue = originalValue.Replace(" ","+");//+号通过url传递变成了空格。
javascript将url中的参数加密解密代码
javascript将url中的参数加密解密代码今天在做⼀个⽼项⽬时,遇到⼀个需求,在javascript将url中的参数加密解密,从⽹上找发现了这段有⽤的代码:复制代码代码如下:<SCRIPT LANGUAGE="JavaScript"><!-- Beginfunction Encrypt(str, pwd) {if(str=="")return "";str = escape(str);if(!pwd || pwd==""){ var pwd="1234"; }pwd = escape(pwd);if(pwd == null || pwd.length <= 0) {alert("Please enter a password with which to encrypt the message.");return null;}var prand = "";for(var I=0; I<pwd.length; I++) {prand += pwd.charCodeAt(I).toString();}var sPos = Math.floor(prand.length / 5);var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos*2) + prand.charAt(sPos*3) + prand.charAt(sPos*4) + prand.charAt(sPos*5));var incr = Math.ceil(pwd.length / 2);var modu = Math.pow(2, 31) - 1;if(mult < 2) {alert("Algorithm cannot find a suitable hash. Please choose a different password. /nPossible considerations are to choose a more complex or longer password.");return null;}var salt = Math.round(Math.random() * 1000000000) % 100000000;prand += salt;while(prand.length > 10) {prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();}prand = (mult * prand + incr) % modu;var enc_chr = "";var enc_str = "";for(var I=0; I<str.length; I++) {enc_chr = parseInt(str.charCodeAt(I) ^ Math.floor((prand / modu) * 255));if(enc_chr < 16) {enc_str += "0" + enc_chr.toString(16);}elseenc_str += enc_chr.toString(16);prand = (mult * prand + incr) % modu;}salt = salt.toString(16);while(salt.length < 8)salt = "0" + salt;enc_str += salt;return enc_str;}function Decrypt(str, pwd) {if(str=="")return "";if(!pwd || pwd==""){ var pwd="1234"; }pwd = escape(pwd);if(str == null || str.length < 8) {alert("A salt value could not be extracted from the encrypted message because it's length is too short. The message cannot be decrypted.");return;}if(pwd == null || pwd.length <= 0) {alert("Please enter a password with which to decrypt the message.");return;}var prand = "";for(var I=0; I<pwd.length; I++) {prand += pwd.charCodeAt(I).toString();}var sPos = Math.floor(prand.length / 5);var mult = parseInt(prand.charAt(sPos) + prand.charAt(sPos*2) + prand.charAt(sPos*3) + prand.charAt(sPos*4) + prand.charAt(sPos*5));var incr = Math.round(pwd.length / 2);var modu = Math.pow(2, 31) - 1;var salt = parseInt(str.substring(str.length - 8, str.length), 16);str = str.substring(0, str.length - 8);prand += salt;while(prand.length > 10) {prand = (parseInt(prand.substring(0, 10)) + parseInt(prand.substring(10, prand.length))).toString();}prand = (mult * prand + incr) % modu;var enc_chr = "";var enc_str = "";for(var I=0; I<str.length; I+=2) {enc_chr = parseInt(parseInt(str.substring(I, I+2), 16) ^ Math.floor((prand / modu) * 255));enc_str += String.fromCharCode(enc_chr);prand = (mult * prand + incr) % modu;}return unescape(enc_str);}// End --></script>以后碰到加密解密问题,直接将上述代码写成⼀个js⽂件,就搞定。
利用MVC的过滤器实现url的参数加密和解密
利⽤MVC的过滤器实现url的参数加密和解密 最近在与⼀个IOS应⽤做接⼝对接,之前⼀直都没有遇到什么很⼤的问题,但是有⼀天发现可以通过软件解析app的url,然后直接通过url的拼接修改接⼝数据,这⼀下使得数据的安全性和准确性都降低了,于是就想到了url加密。
然后在⽹上查了⼀下url的加密算法,使⽤⽐较普遍的还是Base64的加密,但是对于如何实现加密,⽹上的资料确不多,可能是我搜索的关键词不对。
既然没有现成的参考⽂件,那么就只能靠⾃⼰了。
因为所有的Controller都继承⼀个基Controller,所以⽐较⾃然的想到在基Controller中做⼀些操作,由于需要在执⾏具体的Action之前对url中的参数进⾏解密处理,所以联想到了做项⽬时使⽤的IHttpModule 接⼝,不过MVC有个更好的功能,那就是过滤器Filter,mvc总共提供了四种默认的Filter接⼝,IAuthorizationFilter、IActionFilter、IResultFilter和IExceptionFilter,关于这四种Filter的执⾏时间和使⽤⽅法⽹络上有很多,这⾥就不赘述了。
下⾯就我的摸索过程做⼀个说明,也供⼤家参考,如果⼤家有更好的⽅法,还望不吝告知。
要想能够解密Url的参数,⾸先需要获取的HttpRequest传递过来的参数。
⾸先创建⼀个Filter,我暂且命名为DecodeUrlFitler,继承⾄ActionFilterAttribute,这个类已经继承了IActionFilter接⼝,它有四个抽象⽅法,分别是OnActionExecuted(在action执⾏完后执⾏)、OnActionExecuting(在action执⾏前执⾏)、OnResultExecuted(在view视图渲染之后执⾏)、OnResultExecuting(在view视图渲染之前执⾏)。
很明显,我们需要重写OnActionExecuting⽅法,在action执⾏之前,将url中的参数进⾏解密。
关于前端url加密方式总结(Vue-cli中使用)
关于前端url加密⽅式总结(Vue-cli中使⽤)有的时候链接信息中存在敏感信息或者不想让⽤户⼿动修改链接从⽽改变内容,这时候就需要进⾏链接加密处理,虽然这种⽅式只能简单的预防,不过还是能起到⼀定作⽤的,这⾥根据我的思路进⾏总结处理⽅式1. ⾸先⽹站页⾯url都有对应的不同路径组成,这个地⽅不⽤修改(当然也可以⾃⼰扩展),后边可能会拼接⼀些参数对这串参数进⾏处理;思路就是在页⾯跳转前进⾏拦截修改参数部分,及在改变页⾯某些状态需要改变url内容时进⾏修改参数部分;那么页⾯在重新载⼊或者进⼊时,⾸先需要进⾏对页⾯的加密参数解密到对应字段上进⾏后边的参数处理;2. 下边是url加密和解密⽅法/*** url参数加密* 传⼊json格式的串* @param {*Object} query*/const EncryUrl = query => {if (!utils.isObject(query)) {return "";}try {query = JSON.stringify(query);query = window.encodeURIComponent(query);return window.btoa(query); // 编码} catch (err) {console.log('%c url-encry-error:' + JSON.stringify(err), 'color:red;');}return "";}/*** url参数解密* 传⼊加密的json串* @param {*string} val*/const DecryptUrl = val => {if (!utils.isString(val)) {return false;}try {let decryStr = window.atob(val); // 解码return window.decodeURIComponent(decryStr);} catch (err) {console.log('%c url-decry-error:' + JSON.stringify(err.stack), 'color:red;');}return false;}以上,加密⽅法EncryUrl,⾸先判断传⼊的数据是否是Object的,然后把json转成字符串,使⽤encodeURIComponent进⾏URI编码(encodeURIComponent⽅法执⾏,让浏览器能够接受和理解,若中⽂在使⽤后边的window.btoa会报错),然后使⽤window.btoa再次转换输出;解密DecryptUrl,以同样的⽅式反过来执⾏进⾏解密,⾄于为什么后边没有使⽤JSON.parse,看后边的;/*** 从地址栏获取指定参数值* @param {*string} param*/const GetQueryParam = (param) => {let h = window.location.href;let reg = new RegExp("[\?\&]?" + param + "=([,-\w]+)[\&]?", "i");if (reg.test(h)) {let v = reg.exec(h)[1];return v;}return "";};/*** 返回地址栏加密 Object* @param {*string} param*/const GetQueryParamOfObjEntry = () => {let keyStr = GetQueryParam("key");if (!keyStr) {return "";}try {let objStr = DecryptUrl(keyStr);let obj = JSON.parse(objStr);return obj;} catch (err) {console.log('%c url-json-parse-error:' + JSON.stringify(err.stack), 'color:red;');}return "";}上边的两个⽅法,GetQueryParam是封装了获取指定链接参数的代码块,GetQueryParamOfObjEntry是获取以key这个指定参数后⽅的解密数据,这⾥可以看到有JSON.parse这个⽅法,因为我这⾥约定了链接后⽅参数是以key为key的⼀个参数,当然可以换成其他的参数;3. 然后注意在router⾥边需要处理对应的改变// url参数加密function encryUrlOfRouter(to, from, next) {// 这⾥对路由参数key进⾏加密if (Object.keys(to.query).length > 0 && !to.query.key) {let urlEntry = EncryUrl(to.query);if (urlEntry) {next({path: to.path,query: {key: urlEntry}})return false;}next({path: to.path})return false;}return true;}以上代码块,encryUrlOfRouter这个⽅法放在router.beforeEach⾥边执⾏,⾸先判断当前链接是否有参数,若有且如果不存在key,那么就使⽤EncryUrl进⾏处理query加密,然后修改当前链接参数,这时,router会再次执⾏⼀次;4. 那么在页⾯中使⽤时,⾸先是初次渲染拿出数据了,在created中执⾏时可以使⽤GetQueryParamOfObjEntry来获取数据,然后对应参数赋值;其次是在⼀些改变url参数的操作,(场景:⽐如分页,触发分页后,把这个链接复制到其他的窗⼝中,既要让参数加密,⼜必须让这个链接打开窗⼝的分页的状态和被复制页⾯的分页⼀样),这个时候在每次触发改变链接的时候执⾏这个⽅法就没问题了;当然这时候并没有改变页⾯位置,也不会刷新页⾯,只是⾛了⼀遍路由,下⽅代码就是对应改变的⽅法了, searchCondition就是我存放需要改变url参数的对象editUrlQuery() {this.$router.push({ name: this.$, query: this.searchCondition });}5. 最后总结⼀下,如果是对安全性要求⽐较⾼在执⾏加密时可以换其他的⽅式来加密,我这⾥只是简单的加密了⼀下,让别⼈篡改参数不是那么很轻松,也直接看出url⾥边带的参数是什么;如果在控制台中进⾏解密测试,你需要执⾏window.decodeURIComponent这个⽅法两次,why?不解释,哈哈,实践⼀下就知道了;如果别⼈修改了key后边的参数,那么解析会出错,或者解析不完全,⾄于修改,随他改吧,看你的加密⽅式了;。
三种保证URL地址可信的加密方式
三种保证URL地址可信的加密方式近日接到一个需求,要求一台资源服务器不仅在可以暴露在公网环境下的同时,还要保证只接受并处理可信的http访问请求。
需求场景如图:为了访问资源文件,用户需要首先访问某一台Frontend Server进行用户身份认证———所有的用户信息均由Frontend Server保存,Frontend Server认证通过后返回真实的重定向地址,用户再根据重定向地址访问Resource Server获取资源文件。
具体的使用场景正如上面所述,下面是我的思考过程...为了保证资源服务器收到的是一个可信的重定向地址,在安全性上有三点考虑:1.重定向地址必须是可信的,即不可以被伪造,必须是由某一台FrontendServer返回的重定向地址。
2.为了防止盗链或资源被采集,每个Frontend Server返回的重定向地址应具有时效性。
这个可以通过在链接地址上增加时间戳实现,但前提是该时间戳不可以被伪造。
3.最后,在必要的情况下,还可以不去响应某一台Frontend Server返回的重定向地址,即认为某一台Frontend Server的重定向地址不可信、该Frontend Server不可信。
这要求Resource Server能够及时标示一台Frontend Server为不可信服务器,并且该Frontend Sever服务器还不可伪造剩余可信服务器返回的重定向地址。
以上三点也可以总结为:防止公网用户伪造URL地址,防止不可信Frontend Server伪造地址,防止过期URL地址访问。
由于Resource Server需要允许所有的公网用户访问,所以不能对Ip进行限制,并且一般情况下Resouce Server也不会与Frontend Server直接通信,因此只能通过URL的验证方式。
Frontend Server在生成每个URL的过程中中应包括Resource Server为每一个Frontend Server分配的账户fsId、密钥fsKey以及记录当前URL生成时间的时间戳fstime。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
URL加密解密完整解决方案采用:.URLEncoder.encode(Base64编码(加密字串), StringCode) 这样的方法来对url中的参数进行加密。
首先我们先说一下如何加密。
一、算法的选择:对于像对url中的参数进行加密的过程,我不建议使用rsa或者是三重des这样的加密算法,主要原因在于性能和速度会受影响。
我建议大家使用对称加密如:DES或者是PBE算法。
我们在这边就使用PBEWithMD5AndDES来实现加密。
二、加密原理对于一个纯文本,加密后它会变成一堆乱码,这堆乱码包括了许多非法字符,我们不希望把这些字符放入bean中,因此在加密完后,我们还要对加密结果进行base64编码。
PBE从字面上理解,它必须使用一个口令,我们不希望我们的加密过于复杂而影响页面跳转的速度,因此我们不采用口令+KEY的形式,我们这边的口令就是我们的KEY。
因此:我们的整个加密过程实现如下:输入口令(KEY)--> 加密文本 --> 以base64对加密后的结果进行编码-->以.URLEncoder.encode编码成浏览器可以识别的形式-->传输给接受的action而解密过程如下:接受的action得到参数-->以base64对结果进行解码-->得到纯加密文本-->解密-->得到解密后的值三、BASE64这边对于BASE64的原理不多说了,只说实现,目前网上有很多实现方式,有自己写的,有用sun.misc.*的,我们在这个例子里将使用javax.mail.internet.MimeUtility自带的base64编码工具。
需要引入activation.jar和mail.jar两个包。
下面是具体的实现:import javax.mail.internet.MimeUtility;public class Base64 {public static byte[] encode(byte[] b) throws Exception {ByteArrayOutputStream baos = null;OutputStream b64os = null;try {baos = new ByteArrayOutputStream();b64os = MimeUtility.encode(baos, "base64");b64os.write(b);b64os.close();return baos.toByteArray();} catch (Exception e) {throw new Exception(e);} finally {try {if (baos != null) {baos.close();baos = null;}} catch (Exception e) {}try {if (b64os != null) {b64os.close();b64os = null;}} catch (Exception e) {}}}public static byte[] decode(byte[] b) throws Exception { ByteArrayInputStream bais = null;InputStream b64is = null;try {bais = new ByteArrayInputStream(b);b64is = MimeUtility.decode(bais, "base64");byte[] tmp = new byte[b.length];int n = b64is.read(tmp);byte[] res = new byte[n];System.arraycopy(tmp, 0, res, 0, n);return res;} catch (Exception e) {throw new Exception(e);} finally {try {if (bais != null) {bais.close();bais = null;}} catch (Exception e) {}try {if (b64is != null) {b64is.close();b64is = null;}} catch (Exception e) {}}}}四、加密解密工具类的实现有了BASE64的工具类,下面的工作将变得简单了,编写我们的加密解密工具类吧:import java.io.DataOutputStream;import java.io.FileOutputStream;import java.security.*;import javax.crypto.*;import javax.crypto.spec.*;import java.util.*;import mons.logging.Log;import mons.logging.LogFactory;public class SecurityHelper {protected final static Log logger = LogFactory.getLog(SecurityHelper.class);private final static int ITERATIONS = 20;public static String encrypt(String key, String plainText) throws Exception {String encryptTxt = "";try {byte[] salt = new byte[8];MessageDigest md = MessageDigest.getInstance("MD5");md.update(key.getBytes());byte[] digest = md.digest();for (int i = 0; i < 8; i++) {salt[i] = digest[i];}PBEKeySpec pbeKeySpec = new PBEKeySpec(key.toCharArray());SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");SecretKey skey = keyFactory.generateSecret(pbeKeySpec);PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATIONS); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");cipher.init(Cipher.ENCRYPT_MODE, skey, paramSpec);byte[] cipherText = cipher.doFinal(plainText.getBytes());String saltString = new String(Base64.encode(salt));String ciphertextString = new String(Base64.encode(cipherText));return saltString + ciphertextString;} catch (Exception e) {throw new Exception("Encrypt Text Error:" + e.getMessage(), e);}}public static String decrypt(String key, String encryptTxt)throws Exception {int saltLength = 12;try {String salt = encryptTxt.substring(0, saltLength);String ciphertext = encryptTxt.substring(saltLength, encryptTxt.length());byte[] saltarray = Base64.decode(salt.getBytes());byte[] ciphertextArray = Base64.decode(ciphertext.getBytes());PBEKeySpec keySpec = new PBEKeySpec(key.toCharArray());SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");SecretKey skey = keyFactory.generateSecret(keySpec);PBEParameterSpec paramSpec = new PBEParameterSpec(saltarray,ITERATIONS);Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");cipher.init(Cipher.DECRYPT_MODE, skey, paramSpec);byte[] plaintextArray = cipher.doFinal(ciphertextArray);return new String(plaintextArray);} catch (Exception e) {throw new Exception(e);}}注意上面加粗的三处地方:private final static int ITERATIONS = 20;上面的值越大,加密越深,一般例子都以"Java安全性编程指南”这本书中的例子的值为准,设成1000,我们在这边只需要20就够了,原因就是考虑到加解密的速度问题。
int saltLength = 12;这是base64解码后的盐的长度,加密后再经BASE64编码后盐的长度为8,BASE64解码后盐的长度为12,至于为什么,这也是根据BASE64的原理得出的,具体可以看BASE64原理,网上很多,说得也都很简单。
PBEWithMD5AndDES我们使用的是PBEWithMD5AndDES加密。
下面编写一个测试类public static void main(String[] args) {String encryptTxt = "";String plainTxt = "hello oh my god";try {System.out.println(plainTxt);encryptTxt = encrypt("mypassword01", plainTxt);plainTxt = decrypt("mypassword01", encryptTxt);System.out.println(encryptTxt);System.out.println(plainTxt);} catch (Exception e) {e.printStackTrace();System.exit(-1);}}}五、工具类在struts action中的具体使用MyTaskDTO taskDTO = new MyTaskDTO();TaskInstance ti = (TaskInstance) it.next();taskDTO.setTaskName(ti.getName());taskDTO.setTaskCreateDate(sd.format(ti.getCreate()));taskDTO.setTaskDescr(ti.getDescription());/* no encrypted data */String taskId = String.valueOf(ti.getId());String tokenId = String.valueOf(ti.getToken().getId());processImgName = PropertyUtil.getProperty(Constants.BPM_PROCESS_PAYMENT_PROCESSIMAGE).toString()+ ".jpg";processDefId = String.valueOf(ti.getToken().getProcessInstance().getProcessDefinition().getId());/* encrypted data */taskId = EncryptUrlPara.encrypt(taskId);tokenId = EncryptUrlPara.encrypt(tokenId);processImgName = EncryptUrlPara.encrypt(processImgName);processDefId = EncryptUrlPara.encrypt(processDefId);taskDTO.setTaskId(taskId);taskDTO.setTokenId(tokenId);taskDTO.setProcessDefinitionId(processDefId);taskDTO.setProcessImageName(processImgName);六、jsp页面中的encode把上述这个bean放入request中,带到下一个jsp页面中后,在jsp页面的处理如下:String processImgPath=taskDTO.getProcessImageName();String processDefId=taskDTO.getProcessDefinitionId();processImgPath=.URLEncoder.encode(processImgPath,"UTF-8");processDefId=.URLEncoder.encode(processDefId,"UTF-8");String showProcessImgUrl=request.getContextPath()+"/queryMyTask.do";<ahref="<%=showProcessImgUrl%>?method=showProcessImg&processDefinitionId=<%=processD efId%>&processImgPath=<%=processImgPath%>" target="_blank"><u><span class="left_txt">查看当前进程</span></u></a>七、在接受加密参数的action中对加密的值进行解密我们假设我们的接受的action为: queryMyTask.do,它接受一系列的参数,基中,processDefId和processImgPath是加密的。