页面跳转的参数是怎么加密?
页面跳转的参数是怎么加密,解密?
[解决办法]
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();
//System.Security.Cryptography.DESCryptoServiceProvider
//定义访问数据加密标准 (DES) 算法的加密服务提供程序 (CSP) 版本的包装对象。无法继承此类。
Byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
//System.Text.Encoding 表示字符编码
//Encoding.UTF8 属性 获取 UTF-8 格式的编码
//GetBytes 将指定的 String 或字符数组的全部或部分内容编码为字节数组
MemoryStream ms = new MemoryStream();
//System.IO.MemoryStream 创建以内存作为其支持存储区的流
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey64, Iv64), CryptoStreamMode.Write);
//System.Security.Cryptography.CryptoStream 定义将数据流链接到加密转换的流
//public CryptoStream(Stream stream,ICryptoTransform transform,CryptoStreamMode mode)
//参数
//stream
//对其执行加密转换的流。
//transform
//要对流执行的加密转换。
//mode
//CryptoStreamMode 值之一
//DESCryptoServiceProvider.CreateEncryptor方法 创建对称数据加密标准 (DES) 加密器对象
//用指定的 Key 和初始化向量 (IV) 创建对称数据加密标准 (DES) 加密器对象
cs.Write(inputByteArray, 0, inputByteArray.Length);
//CryptoStream.Write 方法 将一个字节序列写入当前 CryptoStream,并将流中的当前位置提升写入的字节数
//public override void Write(
//byte[] buffer,
//int offset,
//int count
//);
//参数
//buffer
//字节数组。此方法将 count 个字节从 buffer 复制到当前流。
//offset
//buffer 中的字节偏移量,从此偏移量开始将字节复制到当前流。
//count
//要写入当前流的字节数。
cs.FlushFinalBlock();
//CryptoStream.FlushFinalBlock 方法 用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区。
return Convert.ToBase64String(ms.ToArray());
//Convert.ToBase64String 方法 将 8 位无符号整数数组的值转换为它的等效 String 表示形式(由以 64 为基的数字组成)。
}
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?clubID= "+Encrypt(postUser+ ", "+postPass+ ", "+nowTime.ToString()));
}
[解决办法]
上是加密,下面是解密
//随机选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传递变成了空格。
string decryptResult = Decrypt(originalValue);
//DecryptString(string)解密字符串
string delimStr = ", ";
char[] delimiterArray = delimStr.ToCharArray();
//String.ToCharArray 方法 将此实例中的字符复制到 Unicode 字符数组
string [] userInfoArray = null;
userInfoArray = decryptResult.Split(delimiterArray);
//String.Split 方法 标识此实例中的子字符串(它们由数组中指定的一个或多个字符进行分隔),
//然后将这些子字符串放入一个 String 数组中
string userName = userInfoArray[0];//这句好像没什么用
User userToLogin = new User();//之前应该定义了一个实体类
userToLogin.Username = userInfoArray[0];
userToLogin.Password = userInfoArray[1];
}
}
[解决办法]
举个例子,你需要把对象a,b,c,d 4个传递给页面hello.aspx,可以写:
object[] p=new object[4]{a,b,c,d};
string key=p.GetHashCode().ToString();
Cache[key]=p;
Response.Redirect( "hello.aspx?pid= "+key);
在hello.aspx中接收对象,可以写:
string key=Request.QueryString[ "pid "];
object[] p=Cache[key];
这样就OK了。客户端只能看到一个pid,它什么内容也得不到。
[解决办法]
string key=p.GetHashCode().ToString();
这一句是个关键,它可以避免与Cache中其它项目重复。当然你还可以使用更随机的方法取得key。
[解决办法]
可以试试response.transfer,只是遇到刷新可能会有问题