因工作需要,将下面这段C#用PHP实现,请教各位大神能帮忙写一下,我弄了两天了都没成功,书到用时方恨少。public static string encryptData( string clientid, string CLIENTFLAG, string CLIENTKEY, string CLIENTCONST)
{
Random rd = new Random();
int N1 = rd.Next(1000, 10000);
int N2 = rd.Next(1000, 10000);
}
string str = N2 +CLIENTFLAG +CLIENTKEY +CLIENTCONST + N1;
byte[] byteStr = System.Text.Encoding.UTF8.GetBytes(str);
string strMd5 = BitConverter.ToString(md5.ComputeHash(byteStr)).Replace("-", string.Empty).ToLower();
return N1 + strMd5.Substring(7, 21) + N2;
}
{
Random rd = new Random();
int N1 = rd.Next(1000, 10000);
int N2 = rd.Next(1000, 10000);
}
string str = N2 +CLIENTFLAG +CLIENTKEY +CLIENTCONST + N1;
byte[] byteStr = System.Text.Encoding.UTF8.GetBytes(str);
string strMd5 = BitConverter.ToString(md5.ComputeHash(byteStr)).Replace("-", string.Empty).ToLower();
return N1 + strMd5.Substring(7, 21) + N2;
}
//大致是这个意思吧
define('CLIENTFLAG',"flag");
define('CLIENTKEY',"key");
define('CLIENTCONST',"const");
function encryptData($clientid){
$n1=mt_rand(1000,10000);
$n2=mt_rand(1000,10009);
$str= substr(md5($n2.CLIENTFLAG.CLIENTKEY.CLIENTCONST.$n1),7,21);
return $n1.$str.$n2;}
话不能这么说,如果是XXX接口的签名验证函数,你不可能自立一个算法。另外php里md5的结果还受php文件字符编码影响,麻烦的很
再另外原代码返回结果长度都不一样,后面真的能用于验证吗?
C#就不受影响了吗?
byte[] byteStr = System.Text.Encoding.UTF8.GetBytes(str);
不也统一化为 utf-8 了吗?程序中先对 N2 +CLIENTFLAG +CLIENTKEY +CLIENTCONST + N1 做 MD5.ComputeHash
而 MD5.ComputeHash 的源码是
public byte[] ComputeHash(byte[] buffer)
{
if (this.m_bDisposed)
{
throw new ObjectDisposedException(null, Environment.GetResourceString("ObjectDisposed_Generic"));
}
if (buffer == null)
{
throw new ArgumentNullException("buffer");
}
this.HashCore(buffer, 0, buffer.Length);
this.HashValue = this.HashFinal();
byte[] buffer2 = (byte[]) this.HashValue.Clone();
this.Initialize();
return buffer2;
}所以他实际做的是取哈希值,php 提供了好几个求哈希值的函数,你一个个试试如果是做验证的话,那么 CLIENTFLAG 、CLIENTKEY、CLIENTCONST 都必须是已知的
但如果 CLIENTFLAG 、CLIENTKEY、CLIENTCONST 都可以明文传递的话,那么验证又有什么意义呢?话不能这么说,如果是XXX接口的签名验证函数,你不可能自立一个算法。另外php里md5的结果还受php文件字符编码影响,麻烦的很
再另外原代码返回结果长度都不一样,后面真的能用于验证吗?
话不能这么说,如果是XXX接口的签名验证函数,你不可能自立一个算法。另外php里md5的结果还受php文件字符编码影响,麻烦的很
再另外原代码返回结果长度都不一样,后面真的能用于验证吗?版主你没看清楚,我是说受php代码文件的字符编码影响,并且C#的字符串编码统一为unicode。
如果这个结果不用于验证,那这个算出来的东西有什么用途?另外如果n1n2长度不固定,就没办法取出来再验证。
所以移植的 php 也要保证被操作串为 utf-8 编码(php 提供有 iconv、mb函数组完成此事)
2、n1、n2长度是固定的!
rd.Next(1000, 10000) 返回的是一个 1000~9999 的4位数字串
3、n1 和 n2 最终被加在结果串两端
return N1 + strMd5.Substring(7, 21) + N2
是一种自解码样式
所以不能用于检验,CLIENTFLAG 、CLIENTKEY、CLIENTCONST 和 N1、N2 都是已知的情况下,用索引检验是没有意义的
不同的 CLIENTFLAG 、CLIENTKEY、CLIENTCONST 和 N1、N2 拼凑出 encryptData 虽然很费时,但不是不可能做到的。何况还只有14位长话不能这么说,如果是XXX接口的签名验证函数,你不可能自立一个算法。另外php里md5的结果还受php文件字符编码影响,麻烦的很
再另外原代码返回结果长度都不一样,后面真的能用于验证吗?版主你没看清楚,我是说受php代码文件的字符编码影响,并且C#的字符串编码统一为unicode。
如果这个结果不用于验证,那这个算出来的东西有什么用途?另外如果n1n2长度不固定,就没办法取出来再验证。
CLIENTFLAG = “CLIENTFLAG”;
CLIENTKEY = "CLIENTKEY";
CLIENTCONST = "CLIENTCONST";
如果令
CLIENTFLAG = “CLIENTFL”;
CLIENTKEY = "AGCLIENT";
CLIENTCONST = "KEYCLIENTCONST";
那么,显然得到的 MD5.ComputeHash 是一样的
所以并没有检验的价值
还是那句话,如果这个结果不用于验证,我想不出它被捏出来有什么用。
我说的那么多,是证明这个函数是不能产生可供验证的通行字的(是针对你#3的论述的,同时也反证我#2的说法)
这是算法本身的讨论,与语言实现无关,更与讨论的人无关
假如CSDN密码我设成123456,没两天就被人盗了,可以推断出CSDN的身份验证根本没用吗?
//生成加密串
function encryptData($clientID,$clientFlag,$clientKey,$clientConst)
{
$n1 = mt_rand(1000,10000);
$n2 = mt_rand(1000,10000);
$str = substr(md5($n2.$clientFlag.$clientKey.$clientConst.$n1),7,21);;
return $n1.$str.$n2;
}$url = "http://192.168.127.1/order/WaitOrder.aspx?verifyData=".encryptData('123456','biaoshi','key','changliang')."&clientID=123456&RequestType=down";clientID是明文发送的,verifyData做验证。