哈希加密
A. 加密哈希函数和非加密哈希函数的区别
Every cryptographic hash function is a hash function. But not every hash function is a cryptographic hash.
A cryptographic hash function aims to guarantee a number of security properties. Most of that it's hard to find collisions or pre-images and that the output appears random. (There are a few more properties, and "hard" has well defined bounds in this Context, but that's not important here.)
Non cryptographic hash functions just try to avoid collisions for non malicious input.Some aim to detect accidental changes in data (CRCs), others try to put objects into different buckets in a hash table with as few collisions as possible.
In exchange for weaker stories they are typically very much.
I'd still call md5 a cryptographic hashfunction, since it aimed to prevent security. But it's broken, and thus no longer usable as cryptographic hash. On the other hand when you have a non cryptographic hash function, you can not really call it "Broken", since it never tried to be secure in the first place.
https://crypto.stackexchange.com/questions/3690/why-is-sha-1-considered-broken
所有的加密哈希函数都是哈希函数,反之不然。
加密哈希函数旨在保证一系列的安全属性。它们大部分都很难发生碰撞或是被找出加密的原文,而且哈希值看起来是随机的。
非加密哈希函数只是尽力去避免非恶意输入产生的碰撞;或是用于检测出数据的意外改变(CRC,循环冗余校验);还有一些用于将Object分配到hash table的不同的哈希桶(hash table是一种数据结构,可以参考java中hash table的实现)中,并尽量产生较少的碰撞。由于较弱的要求,这些哈希函数数目很多。[最后一句不知道翻译对不对]
我们仍然将md5视作加密哈希函数,因为它是为了保护安全性设计的。但是md5是"broken"的,因此不再用作加密哈希。另一方面,你不可以称一个非加密哈希是"broken"的,因为它就不是拿来加密用的。
对"broken"的解释:
In a single sentence: a secure hash is broken if an attacker can generate a desired hash faster than the brute-force time, and it is insecure if it can be generated in a reasonable amount of time.
https://www.quora.com/What-does-it-mean-when-a-hashing-algorithm-has-been-broken
简单地说:一旦攻击者可以用比暴力破解更快的速度破解一个加密哈希,那么它就是"broken"的;而如果能在合理时间内(更短时间)完成破解,这个加密哈希被视作"insecure"的(不安全的)。
B. 怎么用哈希函数给数据库中的密码加密
可以使用 System.Security.Cryptography 名称空间中包含的加密资源方便地生成和比较哈希值。 因为所有哈希函数的输入类型都是 Byte[],所以必须先将源数据转换为字节数组后再计算哈希值。 若要为一个字符串值创建哈希值,请按照下列步骤操作: 打开 Visual Studio .NET。 在 Microsoft C# 中新建控制台应用程序。Visual C# .NET 为您创建一个公用类以及一个空的 Main() 方法。 对 System、System.Security.Cryptography 和 System.Text 名称空间使用 using 指令,这样,在后面的代码中就不需要限定这些名称空间中的声明了。这些语句必须放在所有其他声明之前。 using System; using System.Security.Cryptography; using System.Text; 声明一个字符串变量以存放源数据,并声明两个字节数组(未定义大小)分别存放源字节和得出的哈希值。 s
C. hash加密后的密码是多少位,还是说没有固定位数啊
消息摘要算法第五版(英语:Message-Digest Algorithm 5,缩写为MD5),是当前计算机领域用于确保信息传输完整一致而广泛使用的杂凑算法之一(又译哈希算法、摘要算法等),主流编程语言普遍已有MD5的实现。
MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。
D. hash加密为什么不能破
Hash简单点讲就是把任意一段数据经过某种算法生成一段唯一的固定长度的数据。也叫做摘要。为了确保数据A免受意外或者故意(恶意)的修改,往往用这段数据A产生一个hash数据一起发送出去,接收
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系
了解了hash基本定义,就不能不提到一些着名的hash算法,MD5 和 SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。那么他们都是什么意思呢?
这里简单说一下:
1) MD4
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。
2) MD5
MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好
3) SHA1 及其他
SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。
那么这些Hash算法到底有什么用呢?
Hash算法在信息安全方面的应用主要体现在以下的3个方面:
1) 文件校验
我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
2) 数字签名
Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
3) 鉴权协议
如下的鉴权协议又被称作"挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。
以上就是一些关于hash以及其相关的一些基本预备知识。那么在emule里面他具体起到什么作用呢?
什么是文件的hash值呢?
大家都知道emule是基于P2P (Peer-to-peer的缩写,指的是点对点的意思的软件), 它采用了"多源文件传输协议"(Mftp,the Multisource FileTransfer Protocol)。在协议中,定义了一系列传输、压缩和打包还有积分的标准,emule 对于每个文件都有md5-hash的算法设置,这使得该文件独一无二,并且在整个网络上都可以追踪得到。
MD5-Hash-文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与加密算法不同,这一个Hash算法是一个不可逆的单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因此,一旦文件被修改,就可检测出来。
当我们的文件放到emule里面进行共享发布的时候,emule会根据hash算法自动生成这个文件的hash值,他就是这个文件唯一的身份标志,它包含了这个文件的基本信息,然后把它提交到所连接的服务器。当有他人想对这个文件提出下载请求的时候, 这个hash值可以让他人知道他正在下载的文件是不是就是他所想要的。尤其是在文件的其他属性被更改之后(如名称等)这个值就更显得重要。而且服务器还提供了,这个文件当前所在的用户的地址,端口等信息,这样emule就知道到哪里去下载了.
一般来讲我们要搜索一个文件,emule在得到了这个信息后,会向被添加的服务器发出请求,要求得到有相同hash值的文件。而服务器则返回持有这个文件的用户信息。这样我们的客户端就可以直接的和拥有那个文件的用户沟通,看看是不是可以从他那里下载所需的文件。
对于emule中文件的hash值是固定的,也是唯一的,它就相当于这个文件的信息摘要,无论这个文件在谁的机器上,他的hash值都是不变的,无论过了多长时间,这个值始终如一,当我们在进行文件的下载上传过程中,emule都是通过这个值来确定文件。
那么什么是userhash呢?
道理同上,当我们在第一次使用emule的时候,emule会自动生成一个值,这个值也是唯一的,它是我们在emule世界里面的标志,只要你不卸载,不删除config,你的userhash值也就永远不变,积分制度就是通过这个值在起作用,emule里面的积分保存,身份识别,都是使用这个值,而和你的id和你的用户名无关,你随便怎么改这些东西,你的userhash值都是不变的,这也充分保证了公平性。其实他也是一个信息摘要,只不过保存的不是文件信息,而是我们每个人的信息。
那么什么是hash文件呢?
我们经常在emule日至里面看到,emule正在hash文件,这里就是利用了hash算法的文件校验性这个功能了,文章前面已经说了一些这些功能,其实这部分是一个非常复杂的过程,目前在ftp,bt等软件里面都是用的这个基本原理,emule里面是采用文件分块传输,这样传输的每一块都要进行对比校验,如果错误则要进行重新下载,这期间这些相关信息写入met文件,直到整个任务完成,这个时候part文件进行重新命名,然后使用move命令,把它传送到incoming文件里面,然后met文件自动删除,所以我们有的时候会遇到hash文件失败,就是指的是met里面的信息出了错误不能够和part文件匹配,另外有的时候开机也要疯狂hash,有两种情况一种是你在第一次使用,这个时候要hash提取所有文件信息,还有一种情况就是上一次你非法关机,那么这个时候就是要进行排错校验了。
E. 如何计算 MD5 或 sha-1 加密哈希值的文件
文件校验和完整性验证程序
(fciv)
实用程序可以用于计算
md5
或
sha-1
加密哈希值的文件。
有关文件校验和完整性验证程序
(fciv)
实用程序的其他信息,请单击下面的文章编号,以查看
microsoft
知识库中相应的文章:
841290可用性和文件校验和完整性验证程序实用程序的说明
若要计算在
md5
和文件的
sha-1
哈希值,请在命令行键入以下命令:
fciv-md5-sha1
path\filename.ext
例如对于计算
shdocvw.dll
文件
%systemroot%
\system32
文件夹中的
md5
和
sha-1
哈希值,键入以下命令:
fciv-md5-sha1
c:\windows\system32\shdocvw.dll
F. hash的加密过程,
可以使用 System.Security.Cryptography 名称空间中包含的加密资源方便地生成和比较哈希值。 因为所有哈希函数的输入类型都是 Byte[],所以必须先将源数据转换为字节数组后再计算哈希值。 若要为一个字符串值创建哈希值,请按照下列步骤操作: 打开 Visual Studio .NET。 在 Microsoft C# 中新建控制台应用程序。Visual C# .NET 为您创建一个公用类以及一个空的 Main() 方法。 对 System、System.Security.Cryptography 和 System.Text 名称空间使用 using 指令,这样,在后面的代码中就不需要限定这些名称空间中的声明了。这些语句必须放在所有其他声明之前。 using System; using System.Security.Cryptography; using System.Text; 声明一个字符串变量以存放源数据,并声明两个字节数组(未定义大小)分别存放源字节和得出的哈希值。 string sSourceData; byte[] tmpSource; byte[] tmpHash; 使用 GetBytes() 方法(它是 System.Text.ASCIIEncoding 类的成员)将源字符串转换为字节数组(这是哈希函数要求的输入类型)。 sSourceData = "MySourceData"; //Create a byte array from source data. tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); 通过在 MD5CryptoServiceProvider 类的一个实例上调用 ComputeHash 方法,来计算源数据的 MD5 哈希值。 注意,若要计算另一哈希值,需要另创建一个该类的实例。 //Compute hash based on source data. tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource); 此时,tmpHash 字节数组中存放了计算源数据得出的哈希值(128 位值 = 16 个字节)。 通常,将此类值显示或存储为一个十六进制字符串是非常有用的,如以下代码所示: Console.WriteLine(ByteArrayToString(tmpHash)); static string ByteArrayToString(byte[] arrInput) { int i; StringBuilder sOutput = new StringBuilder(arrInput.Length); for (i=0;i < arrInput.Length -1; i++) { sOutput.Append(arrInput[i].ToString("X2")); } return sOutput.ToString(); } 保存并运行代码,以查看计算源数值得出的十六进制字符串。 回到顶端比较两个哈希值 从源数据创建哈希值的目的之一是,提供一种方法查看数据经过一段时间后是否会发生改变,或者在不使用实际值的情况下比较两个值。 两种情况都需要比较两个哈希计算值,如果两个值都存储为十六进制字符串,则比较起来非常方便(如上一节中的最后一步所示)。 但是,两个值很有可能都采用字节数组的形式。 以下代码(继上一节中创建的代码)演示了如何比较两个字节数组。 创建完十六进制字符串后,紧接着基于新的源数据创建一个新的哈希值。 sSourceData = "NotMySourceData"; tmpSource = ASCIIEncoding.ASCII.GetBytes(sSourceData); byte[] tmpNewHash; tmpNewHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource); 比较两个字节数组的最直接的方法是,使用循环语句逐一比较两个值中对应的数组元素。 如果任何元素不同,或者两个数组的长度不同,则两个值不相等。 bool bEqual = false; if (tmpNewHash.Length == tmpHash.Length) { int i=0; while ((i < tmpNewHash.Length) && (tmpNewHash[i] == tmpHash[i])) { i += 1; } if (i == tmpNewHash.Length) { bEqual = true; } } if (bEqual) Console.WriteLine("The two hash values are the same"); else Console.WriteLine("The two hash values are not the same"); Console.ReadLine(); 保存并运行项目,查看从第一个哈希值创建的十六进制字符串,然后检查新的哈希值与原值是否相等。
-__________________________________________________________________________
在.net中,由 System.Security.Cryptography 命名空间提供了加密和哈希的几个类。其中 md5 编码由 MD5CryptoServiceProvider 实现。
在使用过程中由于 MD5CryptoServiceProvider 提供了多种方法去计算md5的hash值,反而令人搞不清楚,所以这里帖出计算md5的几种常见方法先引用命名空间: using System.Security.Cryptography;
using System.Text; 然后:MD5CryptoServiceProvider md5=new MD5CryptoServiceProvider();string source="HelloWorld";
byte[] message;
message=Encoding.Default.GetBytes(source);//方法1
// 使用ComputeHash方法,适合用于计算简单的字符串的md5值时
md5.ComputeHash(message);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法2
// 使用TransformFinalBlock方法,适合用于原始数据不多时
md5.Initialize();
md5.TransformFinalBlock(message,0,message.Length);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法3
// 此方法等同于方法2
md5.Initialize();
md5.TransformBlock(message,0,message.Length,
message,0); //note: output bytes must equal input bytes
md5.TransformFinalBlock(message,0,0);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
//方法4
// 将原始消息分两次编码,得出的结果跟上面的一样,适合用于计算大量原始数据时,例如计算一个文件的md5值
md5.Initialize();
message=Encoding.Default.GetBytes("Hello");
md5.TransformBlock(message,0,message.Length,
message,0);message=Encoding.Default.GetBytes("World");
md5.TransformFinalBlock(message,0,message.Length);
Console.WriteLine(Convert.ToBase64String(md5.Hash));
G. 哈希加密为什么是不可逆的
不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。显然,在这类加密过程中,加密是自己,解密还得是自己,而所谓解密,实际上就是重新加一次密,所应用的“密码”也就是输入的明文。不可逆加密算法不存在密钥保管和分发问题,非常适合在分布式网络系统上使用,但因加密计算复杂,工作量相当繁重,通常只在数据量有限的情形下使用,如广泛应用在计算机系统中的口令加密,利用的就是不可逆加密算法。近年来,随着计算机系统性能的不断提高,不可逆加密的应用领域正在逐渐增大。在计算机网络中应用较多不可逆加密算法的有RSA公司发明的MD5算法和由美国国家标准局建议的不可逆加密标准SHS(Secure Hash Standard:安全杂乱信息标准)等。
不可逆就是假如有两个密码3和4,我的加密算法很简单就是3+4,结果是7,但是通过7我不可能确定那两个密码是3和4,有很多种组合,这就是最简单的不可逆,所以只能通过暴力破解一个一个的试
H. hash加密代码
用md5的算啦:
public static string MD5(string Sourcein)
{
MD5CryptoServiceProvider MD5CSP = new MD5CryptoServiceProvider();
byte[] MD5Source = System.Text.Encoding.UTF8.GetBytes(Sourcein);
byte[] MD5Out = MD5CSP.ComputeHash(MD5Source);
return Convert.ToBase64String(MD5Out);
}
I. C++语言如何哈希加密
Hash是一类算法,最常见的是MD5。
如果是windows平台,可以用动态链接库advapi32.dll,此动态链接库提供以下md5函数:
MD5Init(&ctx);
MD5Update(&ctx, buf, len);
MD5Final(&ctx);
MD5 和 SHA1 是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。
参考一下:http://blog.163.com/star_verygood@yeah/blog/static/16792052720109119031452/