首页 > 代码库 > 长字符串进行加密

长字符串进行加密

问题描述

项目上,需要针对单用户进行设置独占式缓存,由此,便需要一个针对单个客户的缓存Key。

生成key的办法就是:用户请求参数+参数中的手机号。

因为请求参数JSON挺长的,需要对加号前的内容进行压缩,而采用字符串压缩的办法,得不到固定长度,也很是闹人。

折戟GetHashCode

因而想到使用string类型的GetHashCode方法,得到一个int值。单元测试两个内容相同的字符串,是否得到的值一样,结果是肯定的。

大家都知道,int最大也就是几个亿,但是字符串内容确是千变万化,这个GetHashCode真的可以用作缓存的key吗?

翻看微软的文档,发现一个问题:

GetHashCode只是保证在同一个进程的内存空间中,string的返回值可以唯一区别一个string,就是在同一个进程的内存空间中,每个string的hash值都被微软保证不会重复(除非两个string的内容一样),

虽然字符串的组合是无限的,但是对于一个进程的内存空间,顶多就几个G的,几个G的内存所能容纳的string的组合就变成了“有限的”了,int型的几十亿足够来保证这些“有限的”string组合有不同的hash值!

MD5加密

MD5简介:

  MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。

MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法。换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。 

MD5算法原理:

第一步:增加填充 
  增加padding使得数据长度(bit为单位)模512为448。如果数据长度正好是模512为448,增加512个填充bit,也就是说填充的个数为1-512。第一个bit为1,其余全部为0。 
第二步:补足长度 
  将数据长度转换为64bit的数值,如果长度超过64bit所能表示的数据长度的范围,值保留最后64bit,增加到前面填充的数据后面,使得最后的数据为512bit的整数倍。也就是32bit的16倍的整数倍。在RFC1321中,32bit称为一个word。 
第三步:初始化变量: 
  用到4个变量,分别为A、B、C、D,均为32bit长。初始化为: 
    A: 01 23 45 67 
    B: 89 ab cd ef 
    C: fe dc ba 98 
    D: 76 54 32 10 
第四步:数据处理: 
  首先定义4个辅助函数: 
    F(X,Y,Z) = XY v not(X) Z 
    G(X,Y,Z) = XZ v Y not(Z) 
    H(X,Y,Z) = X xor Y xor Z 
    I(X,Y,Z) = Y xor (X v not(Z)) 
  其中:XY表示按位与,X v Y表示按位或,not(X)表示按位取反。xor表示按位异或。 
  函数中的X、Y、Z均为32bit。定义一个需要用到的数组:T(i),i取值1-64,T(i)等于abs(sin(i))的4294967296倍的整数部分,i为弧度。 
  假设前三步处理后的数据长度为32*16*Nbit
第五步:输出:
  最后得到的ABCD为输出结果,共128bit。A为低位,D为高位。

实现:          

       //需要md5加密的字符串
            string testStr = "efswegreg";
            System.Security.Cryptography.MD5CryptoServiceProvider md5Csp = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] encrypt = System.Text.Encoding.Unicode.GetBytes(test);
            byte[] resultEncrypt = md5Csp.ComputeHash(encrypt);

            //将加密后的数组转化为字段(普通加密)
            string result = System.Text.Encoding.Unicode.GetString(resultEncrypt);

            //作为密码方式加密 
            string encryptPWD = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(testStr, "MD5");

 

注:MD5内容,摘自:http://blog.csdn.net/qq61394323/article/details/38395613

长字符串进行加密