说能说清楚C#md5和php md5加密技术的区别,以实例说明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了说能说清楚C#md5和php md5加密技术的区别,以实例说明相关的知识,希望对你有一定的参考价值。

加密字符串为 string str="aaa";
种子为,, string seed="111";
要用C#得到MD5加密字串,要用php 加密字串,
并且两者的密文应该是一样的,写明过程哦,高分相送!
提供点思路,好像C# 得到的是MD5原文,而这php将md5原文转换成了16或32进制字符串,

原理其实都是一样的,你说的种子问题其实可以理解为加密盐

同样的值的MD5结果是一样的,前提是编码需要一致

默认的编码是Unicode
对非英文字符 ,编码不同MD5的结果也是不同的,
以下是对字符"梦世繁华"的md5值的比较,你可以看看

md5("梦世繁华")
UTF-8 32位
e518ec8aa2cccbcf9ce3ca91de29b5a
E518EC8AA2CCCBCF9CE3CA91DE29B5A

GB2312 32位
5ebadad02f82ed6fb6a9d0a8599bc73a
5EBADAD02F82ED6FB6A9D0A8599BC73A

Unicode 32位
5fdfba4d9821973ddd33dc818be31c2f
5FDFBA4D9821973DDD33DC818BE31C2F
//=====================================================
md5 16
md5 16 utf-8
a2cccbcf9c0e3ca9
A2CCCBCF9C0E3CA9

md5 16 gb2312
2f82ed6fb6a9d0a8
2F82ED6FB6A9D0A8

md5 16 unicode
9821973ddd33dc81
9821973DDD33DC81

//=====================================================
md5 Hash Utf-8
e5-18-ec-8a-a2-cc-cb-cf-9c-0e-3c-a9-1d-e2-9b-5a
E5-18-EC-8A-A2-CC-CB-CF-9C-0E-3C-A9-1D-E2-9B-5A

md5 hash GB2312
5e-ba-da-d0-2f-82-ed-6f-b6-a9-d0-a8-59-9b-c7-3a
5E-BA-DA-D0-2F-82-ED-6F-B6-A9-D0-A8-59-9B-C7-3A

md5 hash UNICode
5f-df-ba-4d-98-21-97-3d-dd-33-dc-81-8b-e3-1c-2f
5F-DF-BA-4D-98-21-97-3D-DD-33-DC-81-8B-E3-1C-2F
//=====================================================
Sha1Hash Utf-8
a8-26-5f-e6-69-27-18-f4-3c-1b-16-30-10-9e-ee-3f-8d-df-3a-84
A8-26-5F-E6-69-27-18-F4-3C-1B-16-30-10-9E-EE-3F-8D-DF-3A-84

Sha1Hash GB2312
b4-eb-13-07-bc-7b-9b-d3-e4-8c-4a-82-6a-9b-7b-8b-1e-4a-dd-3b
B4-EB-13-07-BC-7B-9B-D3-E4-8C-4A-82-6A-9B-7B-8B-1E-4A-DD-3B

Sha1Hash UNICode
af-be-2d-d5-d2-7e-fa-55-ea-11-3d-ad-da-35-fc-a5-b9-c4-e9-88
AF-BE-2D-D5-D2-7E-FA-55-EA-11-3D-AD-DA-35-FC-A5-B9-C4-E9-88
参考技术A MD5加密都是使用的一样的规格 不然同样数值得到的结果不就会不一样了吗。那还能分辨是MD5加密吗
如果你想使用C# MD5加密数据 其实是不用自己写转换公式的
C#已经提供了对象 只需要声明使用就行了
以下是C#的例子

using System.Security.Cryptography;
using System.Text;

#region 加密密码,UserMd5(string str1)
protected string UserMd5(string str1)

string cl1 = str1;
string pwd = "";
MD5 md5 = MD5.Create();
// 加密后是一个字节类型的数组
byte[] s=md5.ComputeHash(Encoding.Unicode.GetBytes(cl1));
// 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
for(int i = 0 ; i < s.Length; i++)

// 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
pwd = pwd + s[i].ToString("x");

return pwd;

#endregion

以下是数据库中使用的关键代码
byte[] by = md5.ComputeHash(utf.GetBytes(texPassword.Text.Trim()));
string resultPass = System.Text.UTF8Encoding.Unicode.GetString(by);
conn.ConnectionString=strConn;
SqlCommand comm = new SqlCommand();
string name = texName.Text.Trim().ToString();
comm.CommandText="select Ruser_pwd,Ruser_nm from Ruser where Accountno = @name";
comm.Parameters.Add("@name",SqlDbType.NVarChar,40);
comm.Parameters["@name"].Value=name;
参考技术B 两者是一样的.都是取散列值

PHP数据加密技术之一---MD5()和Sha1()加密

PHP数据加密技术

 

Md5()和Sha1()加密算法是单向的,不存在逆向函数得到原来的明文数据

算法调用:

string md5 ( string $str [, bool $raw_output = false ] )

string Sha1 ( string $str [, bool $raw_output = false ] )

 

参数

str

原始字符串。 

raw_output

如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。 

返回值

MD5()以 32 字符十六进制数字形式返回散列值。 

Sha1()以 40 字符十六进制数字形式返回散列值。 

<?php
$p "123456";
echo md5($p);
?>

 

 

它的输出结果如下:

e10adc3949ba59abbe56e057f20f883e

但是这样使用md5()函数是非常不安全的,如此,大家可以到百度上搜索md5解密,会发现存在解密的网站:




 

如此可见直接向上面那样使用md5()函数是不安全的。虽然md5算法是不可逆的,但是因为它对同一个字符
串计算的结果是唯一的,所以一些人可能会使用“字典攻击”的方式来攻破md5加密的系统。这虽然属于暴力解密,却十分有效,因为大多数系统的用户密码都不回很长所以我们的md5编码成的最终数据可以通过一些网站破解:



 

很显然,被破解了,直接使用md5()这个算法是不够复杂的,然后代码修改如下:

<?php
$p "123456";
echo md5(md5($p).md5($p));
?>

 

打印出的结果:

efd52a4f82c94f80f13671ebd7cd2a6d

到网站破解:




 

很明显,他的结果是错误的,我们的密码是123456而不是零。

我们在一个md5()函数的基础上可以通过多层md5()算法进行加密,因为他是单向的,也许大家疑惑为什么网站能够破解,其实网站的就是暴力破解,他们是不断的保存各种编码和密码然后再进行匹配最终得到密码。


 

 

 

以上是关于说能说清楚C#md5和php md5加密技术的区别,以实例说明的主要内容,如果未能解决你的问题,请参考以下文章

PHP数据加密技术之一---MD5()和Sha1()加密

MD5加密

16位的MD5加密和32位MD5加密的区别

java的32位MD5加密与php中的32位MD5加密结果不一样.求帮助

asp使用MD5加密的密码登录怎么解决?

有关MD5与PHP,高手进