网上很多人在问怎么实现web系统url传输(表单提交)参数加密。例如:要进行一个用户帐号编辑,要传递用户的id,url如下:http://localhost/mysystem/editaccounts.aspx?id=2
但又不想让别人知道这个用户的id为2,恶意的使用者可能还会将2修改,改为别的用户id。
加密传递的参数值可以解决问题。
以下是自己写的dec加密、解密的基类。
文件名:security.cs
using system;
using system.security.cryptography;
using system.io;
using system.text;
namespace eip.framework
{
///
/// security 的摘要说明。
/// security类实现.net框架下的加密和解密。
/// copyright kangsoft@hotmail.com@hotmail.com@hotmail.com
///
public class security
{
string _querystringkey = "abcdefgh"; //url传输参数加密key
string _passwordkey = "hgfedcba"; //password加密key
public security()
{
//
// todo: 在此处添加构造函数逻辑
//
}
///
/// 加密url传输的字符串
///
///
///
public string encryptquerystring(string querystring)
{
return encrypt(querystring,_querystringkey);
}
///
/// 解密url传输的字符串
///
///
///
public string decryptquerystring(string querystring)
{
return decrypt(querystring,_querystringkey);
}
///
/// 加密帐号口令
///
///
///
public string encryptpassword(string password)
{
return encrypt(password,_passwordkey);
}
///
/// 解密帐号口令
///
///
///
public string decryptpassword(string password)
{
return decrypt(password,_passwordkey);
}
///
/// dec 加密过程
///
///
///
///
public string encrypt(string ptoencrypt,string skey)
{
descryptoserviceprovider des = new descryptoserviceprovider(); //把字符串放到byte数组中
byte[] inputbytearray = encoding.default.getbytes(ptoencrypt);
//byte[] inputbytearray=encoding.unicode.getbytes(ptoencrypt);
des.key = asciiencoding.ascii.getbytes(skey); //建立加密对象的密钥和偏移量
des.iv = asciiencoding.ascii.getbytes(skey); //原文使用asciiencoding.ascii方法的getbytes方法
memorystream ms = new memorystream(); //使得输入密码必须输入英文文本
cryptostream cs = new cryptostream(ms,des.createencryptor(),cryptostreammode.write);
cs.write(inputbytearray, 0, inputbytearray.length);
cs.flushfinalblock();
stringbuilder ret = new stringbuilder();
foreach(byte b in ms.toarray())
{
ret.appendformat("{0:x2}", b);
}
ret.tostring();
return ret.tostring();
}
///
/// dec 解密过程
///
///
///
///
public string decrypt(string ptodecrypt, string skey)
{
descryptoserviceprovider des = new descryptoserviceprovider();
byte[] inputbytearray = new byte[ptodecrypt.length / 2];
for(int x = 0; x < ptodecrypt.length / 2; x++)
{
int i = (convert.toint32(ptodecrypt.substring(x * 2, 2), 16));
inputbytearray[x] = (byte)i;
}
des.key = asciiencoding.ascii.getbytes(skey); //建立加密对象的密钥和偏移量,此值重要,不能修改
des.iv = asciiencoding.ascii.getbytes(skey);
memorystream ms = new memorystream();
cryptostream cs = new cryptostream(ms, des.createdecryptor(),cryptostreammode.write);
cs.write(inputbytearray, 0, inputbytearray.length);
cs.flushfinalblock();
stringbuilder ret = new stringbuilder(); //建立stringbuild对象,createdecrypt使用的是流对象,必须把解密后的文本变成流对象
return system.text.encoding.default.getstring(ms.toarray());
}
///
/// 检查己加密的字符串是否与原文相同
///
///
///
///
///
public bool validatestring(string enstring, string fostring, int mode)
{
switch (mode)
{
default:
case 1:
if (decrypt(enstring,_querystringkey) == fostring.tostring())
{
return true;
}
else
{
return false;
}
case 2:
if (decrypt(enstring,_passwordkey) == fostring.tostring())
{
return true;
}
else
{
return false;
}
}
}
}
}
类中url及帐号加密使用了不同的key。调用url加密过程如下:
eip.framework.security objsecurity = new eip.framework.security();
objsecurity.encryptquerystring(''待加密的字符串'');
解密:objsecurity.decryptquerystring(''传递过来的参数);