首页 > 代码库 > 长字符串进行加密
长字符串进行加密
问题描述
项目上,需要针对单用户进行设置独占式缓存,由此,便需要一个针对单个客户的缓存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
长字符串进行加密