zoukankan      html  css  js  c++  java
  • WEB系统中加密\解密URL传输参数

    网上很多人在问怎么实现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(''传递过来的参数);

  • 相关阅读:
    Collections与Arrays
    TreeMap
    HashMap
    单列集合的体系
    泛型的上下限
    09年最受关注的十大Visual Studio插件
    编码中的硬回车与软回车
    无法打开包括文件:'atlrx.h'的解决办法[原]
    【转】Notepad++,Eclipse和Visual Studio 2005常用快捷键对比
    【转】printf格式控制(你所不知道的printf妙用)
  • 原文地址:https://www.cnblogs.com/yuhanzhong/p/2876837.html
Copyright © 2011-2022 走看看