什么是哈希函数

合集下载

c语言哈希库函数

c语言哈希库函数

c语言哈希库函数

一、概述

哈希表是一种常见的数据结构,用于实现键值对的快速查找。C语言中没有内置的哈希表库,但可以通过编写自己的哈希库函数来实现相同的功能。本文将介绍如何编写一个基本的哈希库函数。

二、哈希函数

哈希函数是将键映射到索引的算法。它应该满足以下要求:

1. 对于相同的键,始终返回相同的索引。

2. 对于不同的键,尽可能返回不同的索引。

3. 将键均匀地分布在索引范围内。

常用的哈希函数包括除留余数法、乘法散列法和SHA等。下面是一个简单的除留余数法哈希函数:

```

unsigned int hash(char *key, int size) {

unsigned int hashval = 0;

for (int i = 0; key[i] != '\0'; i++) {

hashval = key[i] + 31 * hashval;

}

return hashval % size;

}

```

该函数将每个字符转换为ASCII码并加权求和,然后使用除留余数法将结果映射到索引范围内。

三、数据结构

为了实现哈希表,我们需要定义一个包含以下成员变量的结构体:

```

typedef struct {

char *key;

void *value;

} HashNode;

typedef struct {

int size;

int count;

HashNode **nodes;

} HashTable;

```

其中,HashNode表示哈希表中的一个键值对,key为键,value为值。HashTable包含三个成员变量:

1. size:哈希表的大小。

散列函数说法正确

散列函数说法正确

散列函数说法正确

【实用版】

目录

1.散列函数的定义与作用

2.散列函数的特性

3.散列函数的应用领域

4.结论

正文

1.散列函数的定义与作用

散列函数,又称哈希函数(Hash Function),是一种将不同长度的输入数据转化为固定长度输出的函数。这种转化过程通常具有单向性和不可逆性,即难以通过已知的输出推导出原始输入。散列函数广泛应用于数据加密、数据完整性校验、快速查找等领域。

2.散列函数的特性

散列函数具有以下几个重要特性:

(1)碰撞耐性(Collision Resistance):难以找到两个不同的输入数据生成相同的散列值。

(2)单向性(One-Way Property):难以通过已知的散列值推导出原始输入数据。

(3)不可逆性:由于输出长度固定,散列函数的逆向计算非常困难。

(4)快速计算:散列函数通常具有较快的计算速度,便于高效应用。

3.散列函数的应用领域

散列函数在众多领域都有广泛应用,主要包括:

(1)数据加密:利用散列函数将明文数据转化为密文,以保证数据的安全性。

(2)数据完整性校验:通过比较数据散列值判断数据是否被篡改。

(3)快速查找:利用散列函数将数据转化为索引,实现高效的数据查找。

(4)分布式系统:在分布式系统中,散列函数可以用于数据分片、负载均衡等。

4.结论

散列函数是一种重要的数据处理工具,具有碰撞耐性、单向性和不可逆性等特性,广泛应用于数据加密、数据完整性校验、快速查找等领域。

hash值计算方式

hash值计算方式

hash值计算方式

一、什么是hash值

hash值是用于标识或索引特定对象的数字或字符串。它是通过特定的算法将输入数据转换为一个固定长度、不可逆转、唯一的字符串。

hash值常用于文件校验、数据加密、数据比对等场景,它可以有效地保护数据的完整性和安全性。

二、hash值计算方式

1.哈希函数

哈希函数是将不同大小的数据映射为固定长度的密钥的算法。假

设哈希函数为h(D),它可以将输入数据D映射为哈希值H,即h(D) = H。

哈希函数的作用是将输入数据压缩为哈希值,并使得不同的数据

产生不同的哈希值。

2.哈希算法

哈希算法是用于计算哈希值的方法,常见的哈希算法有MD5、

SHA-1、SHA-256等。这些算法都是通过不同的数学运算将数据转换成

哈希值。

例如,MD5算法将输入数据进行分块后进行四轮的压缩运算,最

终得到一个128位的哈希值。

3.碰撞处理

由于哈希函数的输入数据可能具有相同的哈希值,这种情况称为

哈希碰撞。碰撞的出现可能会导致数据丢失或者数据错误,因此我们

需要对哈希碰撞进行处理。

处理哈希碰撞的方法有开放地址法、链表法和再哈希法等。

三、应用示例

1.文件校验

文件校验是文件传输和存储中常见的应用场景。通过对文件进行

哈希计算,可以得到一个唯一的哈希值。当文件在传输或存储过程中

发生变化时,哈希值也会发生改变,从而可以判断文件是否完整。

2.密码加密

密码加密是保护用户密码安全的重要措施。通过将密码进行哈希计算并存储哈希值,可以对密码进行保护,即使黑客获取了存储的哈希值也无法还原出原始密码。

3.数据查找

哈希表是一种常见的数据结构,可以通过哈希值快速地查找数据。将数据插入哈希表时,可以使用哈希函数计算数据对应的哈希值,并将其存储在哈希表中。当需要查找数据时,只需要根据哈希函数计算出数据的哈希值,并查找哈希表中对应的数据即可。

c语言自带的hash函数

c语言自带的hash函数

c语言自带的hash函数

C语言自带的哈希函数指的是stdlib库中提供的哈希算法函数。在C语言中,stdlib库是一个通用的标准库,提供了一系列常用的函数,其中包括很多常用的哈希算法函数。在实际编程中,使用stdlib库中的哈希函数可以方便快捷地完成各种哈希操作。

具体来说,stdlib库中提供了两个常用的哈希函数,分别是:

1. hash()

2. hcreate()

其中,hash()函数用于计算给定键值的哈希值,而hcreate()函数用于创建一个哈希表。下面将逐一介绍这两个函数的详细用法和作用。

1. hash()函数

hash()函数是stdlib库中提供的一个常用的哈希算法函数,用于计算给定键值的哈希值。该函数可以用于任何数据结构的哈希表中,包括数组、字符串、结构体等等。hash()函数的定义如下:

unsigned hash(const void *key, size_t length)

其中,key为输入的键值,length为键值的长度。该函数的返回值为一个unsigned整数,表示计算出来的哈希值。

在使用hash()函数时,需要注意以下几点:

(1)键值必须以一个void类型的指针的形式传递给hash()函数,并使用length 指定键值的长度。

(2)哈希值的计算结果是一个无符号整数,其取值范围为[0, 4294967295]。

(3)hash()函数使用了一个简单的算法来计算哈希值。该算法会按位操作键值,并使用数学运算将位运算结果组合成一个哈希值。

2. hcreate()函数

hcreate()函数是stdlib库中提供的一个用于创建哈希表的函数。该函数可以用于创建任何种类的哈希表,包括使用链表或数组实现的哈希表。关于hcreate()函数的使用,以下是一些常见的注意事项:

harsh函数-概述说明以及解释

harsh函数-概述说明以及解释

harsh函数-概述说明以及解释

1.引言

1.1 概述

概述部分的内容可以描述一下harsh函数是什么以及它的重要性和作用。可以参考以下内容:

概述:

随着计算机科学的快速发展,数据安全和隐私保护变得尤为重要。在这个数字化时代,我们需要一种可靠的方法来保护数据的完整性和安全性。在这方面,hash函数扮演着至关重要的角色。

Hash函数是一种常见的密码算法,主要用于将数据转换为固定长度的字符串。它通过对任意长度的数据应用哈希算法,生成一个唯一的哈希值。这个哈希值可以用来验证数据的完整性,检测数据的变化和确定数据的唯一性。

在hash函数的世界里,harsh函数是一种特殊类型的hash函数,它具有许多独特的特点和优势。与传统的hash函数相比,harsh函数不仅具有更高的效率和更低的冲突率,还可以提供更好的数据安全性和隐私保护。

harsh函数的工作原理是将输入数据通过一系列复杂而精确的计算,转换为一个唯一的哈希值。这个哈希值具有不可逆的特性,即无法通过哈希值来恢复原始数据。这种不可逆的特性使得harsh函数成为密码学中重要的工具,广泛应用于数字签名、数据验证、身份验证等各个领域。

此外,harsh函数还具有较低的碰撞概率,即不同的输入数据生成相同哈希值的概率非常低。这使得harsh函数在数据完整性验证等关键应用场景中更加可靠。另外,harsh函数还具有良好的计算性能和效率,使得它能够承担大规模数据处理的任务。

总的来说,harsh函数在确保数据安全性和完整性方面发挥着重要作用。它的独特特性使其在各个领域得到广泛应用,同时也推动了数据安全和密码学的发展。未来,随着计算机技术的不断进步,人们对于更加高效和安全的harsh函数算法的需求也将不断增加。

js hash 函数

js hash 函数

js hash 函数

什么是JavaScript 的hash 函数

在JavaScript 中,hash 函数是一种用于将任意长度的数据(例如字符串、数字等)映射为固定长度的唯一值的算法。这个唯一值通常被称为哈希值或摘要,而hash 函数本身也被称为哈希函数或散列函数。

为什么需要hash 函数

在日常的编程和计算中,我们经常会遇到需要对数据进行索引、检索或比较的情况。然而,直接对大量数据进行比较是一项费时费力的任务。这时,hash 函数的作用就显得尤为重要。

利用hash 函数,我们可以将任意长度的数据转化为固定长度的哈希值,而这个哈希值的计算过程相对较快。这样一来,我们就可以利用哈希值来快速搜索、比较、存储和处理大量数据。

如何实现一个简单的hash 函数

下面,我们将演示一种简单的hash 函数实现,该函数可以将字符串转化为数字类型的哈希值。在这个例子中,我们将使用字符串的ASCII 值求和来作为哈希值的计算方法。请注意,这只是一个简单的示例,并不

适用于所有的情况。

javascript

function hash(str) {

let hashValue = 0;

for (let i = 0; i < str.length; i++) {

hashValue += str.charCodeAt(i);

}

return hashValue;

}

console.log(hash("js hash 函数"));

在上述的代码中,我们首先定义了一个hash 函数,用于计算字符串的哈希值。函数内部使用了一个循环来遍历字符串的每一个字符,并通过`charCodeAt()` 方法获取每个字符的ASCII 值,然后将这些值累加起来并返回。

哈希算法有哪几种

哈希算法有哪几种

哈希算法有哪几种

哈希是密码学的基础,理解哈希是理解数字签名和加密通信等技术的必要前提。

基本含义

先来从基本定义入手。哈希,英文是HASH,本来意思是”切碎并搅拌“,有一种食物就叫HASH,就是把食材切碎并搅拌一下做成的。哈希函数的运算结果就是哈希值,通常简称为哈希。哈希函数有时候也翻译做散列函数,也就是把数据拆散然后重新排列。

根据维基百科的定义,哈希函数要做的事情是给一个任意大小的数据生成出一个固定长度的数据,作为它的映射。所谓映射就是一一对应。一个可靠的哈希算法要满足三点。第一是安全,给定数据M 容易算出哈希值X,而给定X不能算出M,或者说哈希算法应该是一个单向算法。第二是独一无二,两个不同的数据,要拥有不相同的哈希。第三是长度固定,给定一种哈希算法,不管输入是多大的数据,输出长度都是固定的。但是仔细想一下,如果哈希的长度是固定的,也就是取值范围是有限的,而输入数据的取值范围是无限的,所以总会找到两个不同的输入拥有相同的哈希。所以,哈希函数的安全性肯定是个相对概念。如果出现了两个不同输入有相同输出的情况,就叫碰撞,COLLISION。不同的哈希算法,哈希位数越多,也就基本意味着安全级别越高,或者说它的”抗碰撞性“就越好。

再来说说哈希函数的主要作用。哈希的独一无二性,保证了如果数据在存储或者传输过程中有丝毫损坏,那么它的哈希就会变。哈希函数的主要作用就是进行完整性校验,完整的意思是数据无损坏。哈希有很多不同的称呼,有时候叫DIGEST摘要,有时候叫CHECKSUM 校验值,有时候叫FINGERPRINT指纹,其实说的意思差不多,就是用

哈希函数的定义

哈希函数的定义

哈希函数的定义

哈希函数是一种将任意长度的输入(又称为“消息”)映射到固

定长度输出(通常较短)的函数。哈希函数的输出通常称为“哈希值”、“摘要”或“指纹”。哈希函数的主要应用包括数据完整性检验、数

据加密、数据比较和数据索引等方面。哈希函数应当满足以下基本要求:1.对于任意输入,哈希函数应当产生唯一的输出;2.哈希函数应当具有较高的散列性,即使输入略微变化,输出也应当有很大的不同;

3.哈希函数应当是单向函数,即无法根据哈希值逆向计算出原始输入。常见的哈希函数包括MD5、SHA-1、SHA-2等。

- 1 -

hash值范围

hash值范围

hash值范围

Hash值范围是指哈希函数输出的值的范围。哈希函数是一种将任意长度的输入数据映射为固定长度输出数据的函数。哈希函数的输出值通常称为哈希值或摘要。哈希函数的主要应用包括数据完整性校验、数据加密、数据压缩等领域。

哈希函数的输出值通常是一个固定长度的二进制串,例如MD5哈希函数的输出值长度为128位,SHA-1哈希函数的输出值长度为160位。哈希函数的输出值长度越长,哈希值的范围就越大,哈希碰撞的概率就越小。

哈希碰撞是指两个不同的输入数据经过哈希函数计算后得到相同的哈希值。哈希碰撞是一种不可避免的情况,但是好的哈希函数应该尽可能地减小哈希碰撞的概率。在实际应用中,哈希函数的安全性和抗碰撞能力是非常重要的。

哈希函数的输出值通常是一个整数,哈希值的范围取决于哈希函数的实现方式。例如,Java中的hashCode()方法返回的哈希值是一个32位的整数,哈希值的范围是-2147483648到2147483647。在C++中,std::hash模板类返回的哈希值是一个无符号整数,哈希值的范围是0到2^64-1。

哈希函数的输出值通常是一个无符号整数,因为无符号整数可以表示更大的范围。在实际应用中,哈希函数的输出值范围应该足够大,以避免哈希碰撞的发生。同时,哈希函数的输出值范围也应该足够小,以节省存储空间和提高哈希表的效率。

在设计哈希函数时,应该考虑到输入数据的特点和应用场景的需求。例如,在字符串哈希中,应该考虑字符串的长度、字符集、字符顺序等因素。在密码哈希中,应该考虑密码的复杂度、安全性等因素。在数据完整性校验中,应该考虑数据的大小、类型、格式等因素。

第九十讲 Hash函数及其应用

第九十讲 Hash函数及其应用
question(符号表问题),使得数据表的插入、删除、查询操作可 以在平均常数时间内完成。
散列算法MD族是在上个世纪90年代初由mit laboratory for
computer science和RSA data security inc的Ron・Rivest设计的, MD代表消息摘要(message-digest ), MD2(1989)、MD4(1990)和 MD5(1991)都产生一个128位的信息摘要.
p(k ) 1 p
k 365
/ 365 ;
k
k 23, p(k ) 0.5073; k 100, p(k ) 0.9999997;
20
安全问题的思考
目前安全的哈希值位数是多少?
假设哈希值位数为m, 其信息集合大小为 2m,那 么,这集合中多少个消息时 使得出现碰撞的概率大于 50%。
3
引言
在一个开放通信网络的环境中,信息面临的攻击包括窃 听、伪造、修改、插入、删除、否认等。因此,需要提供用 来验证消息完整性的一种机制或服务---消息认证。这种服务
的主要功能包括:
确保收到的消息确实和发送的一样; 确保消息的来源真实有效;
注:对称密码体制和公钥密码体制都可提供这种服务,但用于 消息认证的最常见的密码技术是基于哈希函数的消息认证码。
的输入经过变换以后得到固定长度的输出。 Hash函数的这种

python中的hash函数

python中的hash函数

python中的hash函数

在Python中,hash函数用于将任意大小的数据映射到固定大小的哈希值。Python中的hash函数广泛应用于散列算法、数据结构(例如字典和集合)、加密和数据完整性验证等领域。

Python中的hash函数有以下几种:

1. hash

hash(函数是Python的内置函数,用来获取对象的哈希值。哈希值是一个整数,如果两个对象使用该函数得到的哈希值相同,那么它们的内容也应该相同。哈希函数的返回值是不可变的,相同输入的哈希值会始终保持一致。

2. hashlib模块

hashlib模块提供了一系列哈希算法,包括MD5、SHA1、SHA256等。这些算法都是安全的哈希函数,用于数据完整性校验、密码存储等应用场景。

3.一些数据结构中的哈希函数

在Python的字典和集合中,元素的存储位置是根据元素的哈希值来确定的,所以在使用这些数据结构时会调用元素的__hash__(方法来获取哈希值。为了保证元素的唯一性和正确的查找操作,元素的哈希函数需要满足以下要求:

-对于相同的对象,哈希函数应该始终返回相同的哈希值;

-对于不同的对象,哈希函数应该尽可能返回不同的哈希值,以减少哈希碰撞的概率。

4.哈希算法的应用

哈希算法广泛应用于数据完整性校验和加密等领域。在数据完整性校

验中,通过对数据进行哈希计算,可以生成唯一的哈希值。如果数据在传

输过程中发生改变,哈希值也会发生变化,这样可以确保接收方检验到数

据是否被篡改过。在密码学中,哈希函数被用于存储用户密码的安全性验证。密码经过哈希算法计算得到的哈希值被存储在数据库中,而不是明文

C语言中的哈希计算

C语言中的哈希计算

C语言中的哈希计算

哈希计算是计算机科学中一种常见的算法,用于将数据快速映射为

固定长度的数字或哈希值。在C语言中,哈希计算广泛应用于数据结构、密码学以及其他许多领域。本文将介绍C语言中的哈希计算原理

和常见应用。

一、哈希计算原理

哈希计算的核心思想是将任意长度的输入数据映射为固定长度的哈

希值。哈希值在计算过程中不可逆,即无法通过哈希值还原出原始的

输入数据。C语言中常用的哈希计算算法包括MD5、SHA-1、SHA-

256等。

在哈希计算过程中,需要选择合适的哈希函数。哈希函数负责将输

入数据分割成固定大小的块,并对每个块进行处理,最后生成哈希值。常见的哈希函数采用位运算、位移操作和加法操作等,以确保生成的

哈希值具有较好的随机性和均匀性。

二、C语言中的哈希计算函数

在C语言中,可以使用各种哈希计算函数来进行哈希操作。以下是

一些常见的C语言哈希计算函数的示例:

1. MD5哈希计算函数示例:

```c

#include <openssl/md5.h>

void calculate_md5(const char* input, char* output) {

unsigned char digest[MD5_DIGEST_LENGTH];

MD5((unsigned char*)input, strlen(input), digest);

for (int i = 0; i < MD5_DIGEST_LENGTH; i++) {

sprintf(&output[i*2], "%02x", (unsigned int)digest[i]); }

什么是Hash?什么是Hash算法或哈希函数?什么是map?什么是HashMap?Hash。。。

什么是Hash?什么是Hash算法或哈希函数?什么是map?什么是HashMap?Hash。。。

什么是Hash?什么是Hash算法或哈希函数?什么是map?什么

是HashMap?Hash。。。

1、什么是Hash

Hash也称散列、哈希,对应的英⽂都是Hash。基本原理就是把任意长度的输⼊,通过Hash算法变成固定长度的输出。这个映射的规则就是对应的Hash算法,⽽原始数据映射后的⼆进制串就是哈希值。

2.什么是Hash算法或哈希函数?

(1)Hash函数(Hash算法):

在⼀般的线性表、树结构中,数据的存储位置是随机的,不像数组可以通过索引能⼀步查找到⽬标元素。为了能快速地在没有索引之类的结构中找到⽬标元素,需要为存储地址和值之间做⼀种映射关系h(key),这个h就是哈希函数,

⽤公式表⽰:

h(key)=Addr

h:哈希函数

key:关键字,⽤来唯⼀区分对象的

把线性表中每个对象的关键字通过哈希函数h(key)映射到内存单元地址,并把对象存储到该内存单元,这样的线性表存储结构称为哈希表或散列表。

(2)在设置哈希函数时,通常要考虑以下因素:

○计算函希函数所需的时间

○关键字的长度

○哈希表的长度

○关键字的分布情况

○记录的查找频率

(3)Hash碰撞的解决⽅案

①链地址法

链表地址法是使⽤⼀个链表数组,来存储相应数据,当hash遇到冲突的时候依次添加到链表的后⾯进⾏处理。

链地址在处理的流程如下:

添加⼀个元素的时候,⾸先计算元素key的hash值,确定插⼊数组中的位置。如果当前位置下没有重复数据,则直接添加到当前位置。当遇到冲突的时候,添加到同⼀个hash值的元素后⾯,⾏成⼀个链表。这个链表的特点是同⼀个链表上的Hash值相同。java的数据结构HashMap使⽤的就是这种⽅法来处理冲突,JDK1.8中,针对链表上的数据超过8条的时候,使⽤了红⿊树进⾏优化。

哈希Hash(散列函数)

哈希Hash(散列函数)

Hash(散列函数)

Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数

基本概念

编辑

若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个事先建立的表为散列表。

对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称碰撞。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。

若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。性质

所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果。但另一方面,散列函数的输入和输出不是一一对应的,如果两个散列值相同,两个输入值很可能是相同的,但不绝对肯定二者一定相等(可能出现哈希碰撞)。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。 [1]

hash的标准定义

hash的标准定义

hash的标准定义

在计算机科学中,哈希(Hash)是一种将任意长度的二进制值映射到固定长度的二进制值的技术。这个映射结果通常被存储在一个固定长度的数组中,这个数组叫做哈希表或哈希映射。哈希是一种非常快速和高效的数据处理方法,通常用于实现数据检索和密码学应用。

一个哈希函数(Hash Function)将输入(例如,一段文本或数据)转化为一个整数,这个整数是在一定范围内的。这个范围通常被用来确定哈希表的大小。例如,如果哈希函数将输入转化为32 位整数,那么哈希表的大小就是2^32。

一个好的哈希函数应该具有以下特性:

1. 确定性:对于相同的输入,哈希函数应该总是产生相同的输出。

2. 高效性:哈希函数应该能够快速地计算出结果,这样在处理大量数据时才能保持高效。

3. 雪崩效应:即使输入只发生微小的变化,哈希函数也应该产生大的输出变化。

4. 均匀分布:输出的分布应该尽可能均匀,这样可以减少哈希冲突的可能性。

5. 不可逆性:对于密码学应用来说,哈希函数应该是不可逆的,也就是说,无法从哈希值反推出原始输入。

哈希表是一种数据结构,它使用哈希函数来存储和检索数据。在哈希表中,每个键(Key)都映射到一个值(Value),这个值存储在一个数组的特定位置。当需要查找一个值时,哈希表可以通过使用相同的哈希函数来找到对应的键,然后获取其对应的值。如果两个或更多的键哈希到同一个位置,就会产生哈希冲突。为了解决这个问题,通常会使用一些冲突解决策略,如链地址法或开放地址法。

Hash函数

Hash函数

Hash函数

概念

将任意长度的输⼊变换为固定长度的输出的不可逆的单向密码体制

Hash函数在数字签名和消息完整性检测等⽅⾯有着⼴泛的应⽤

Hash函数同时是⼀种具有压缩特性的单向函数,其像通常称为数字指纹,消息摘要或散列值。

散列值的⽣成过程可以表⽰为

h = H(M)

其中h是定长的散列值,H是哈希函数,M是⼀个变长消息

散列函数主要⽤于消息认证和数字签名,因此需要具备以下特性

1. H可应⽤于任意长度的消息

2. H产⽣定长的输出

3. 对任意给定的消息x,计算H(x)⽐较容易,⽤硬件软件均可实现

4. 单向性:对任意给定的散列值h,找到满⾜H(x) = h 的x在计算上是不可⾏的

5. 抗弱碰撞性:对任意给定的消息x,找到x != y并且H(x) = H(y)的消息y在计算上是不可⾏的

6. 抗强碰撞性:找到任何满⾜H(x) = H(y) 的偶对(x,y)在计算上是不可⾏的

性质2是哈希函数的基本特性,性质3是哈希函数的可⽤性,性质4,5,6是哈希函数为满⾜不同应⽤⽽需具备的基本安全性质

应⽤

数字签名

由于消息散列值通常⽐消息本⾝短的多,因此对消息散列值进⾏数字签名在处理上⽐对消息本⾝进⾏签名要⾼效的多。

⽣成程序或⽂档的数字指纹

hash函数可以⽤来保证消息的完整性。⾸先,通过哈希函数变换得到程序或⽂档的散列值,然后将散列值存储,对程序或⽂档进⾏定时的检测,与已存储的散列值进⾏⽐较,以此来实现完整性验证。

⽤于安全传输和⽤户⼝令

⽤于保存⽤户登陆⼝令(密码),通过⽤户id及⼝令⽣成相应的散列值,然后保存,⽤户在进⼊系统输⼊⼝令时,⽣成散列值与存储的散列值进⾏⽐较,这样可以确保⽤户⼝令不被管理员或攻击者获取到

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

什么是哈希函数

哈希(Hash)函数在中文中有很多译名,有些人根据Hash的英文原意译为“散列函数”或“杂凑函数”,有些人干脆把它音译为“哈希函数”,还有些人根据Hash函数的功能译为“压缩函数”、“消息摘要函数”、“指纹函数”、“单向散列函数”等等。

1、Hash算法是把任意长度的输入数据经过算法压缩,输出一个尺寸小了很多的固定长度的数据,即哈希值。哈希值也称为输入数据的数字指纹(Digital Fingerprint)或消息摘要(Message Digest)等。Hash函数具备以下的性质:

2、给定输入数据,很容易计算出它的哈希值;

3、反过来,给定哈希值,倒推出输入数据则很难,计算上不可行。这就是哈希函数的单向性,在技术上称为抗原像攻击性;

4、给定哈希值,想要找出能够产生同样的哈希值的两个不同的输入数据,(这种情况称为碰撞,Collision),这很难,计算上不可行,在技术上称为抗碰撞攻击性;

5、哈希值不表达任何关于输入数据的信息。

哈希函数在实际中有多种应用,在信息安全领域中更受到重视。从哈希函数的特性,我们不难想象,我们可以在某些场合下,让哈希值来“代表”信息本身。例如,检验哈希值是否发生改变,借以判断信息本身是否发生了改变。`

怎样构建数字签名

好了,有了Hash函数,我们可以来构建真正实用的数字签名了。

发信者在发信前使用哈希算法求出待发信息的数字摘要,然后用私钥对这个数字摘要,而不是待发信息本身,进行加密而形成一段信息,这段信息称为数字签名。发信时将这个数字签名信息附在待发信息后面,一起发送过去。收信者收到信息后,一方面用发信者的公钥对数字签名解密,得到一个摘要H;另一方面把收到的信息本身用哈希算法求出另一个摘要H’,再把H和H’相比较,看看两者是否相同。根据哈希函数的特性,我们可以让简短的摘要来“代表”信息本身,如果两个摘要H和H’完全符合,证明信息是完整的;如果不符合,就说明信息被人篡改了。

数字签名也可以用在非通信,即离线的场合,同样具有以上功能和特性。

由于摘要一般只有128位或160位比特,比信息本身要短许多倍,USB Key或IC卡中的微处理器对摘要进行加密就变得很容易,数字签名的过程一般在一秒钟内即可完成。

哈希函数的安全性

哈希函数的安全性直接关系到数字签名的安全性,如果哈希函数被攻破,数字签名的有效性就会受到质疑。

目前,已经发明的Hash函数有多种,如Snefru、N-Hash、LOKI、AR、GOST、MD、SHA 等。它们在数学上实现的方法各有不同,安全性也各有不同。目前比较常用的Hash函数是MD5和SHA-1。MD5哈希函数以512位来处理输入数据,每一分组又划分为16个32位的子分组。算法的输出由4个32位分组组成,将它们级联起来,形成一个128位的固定长度的哈希值,即输入数据的摘要。SHA-1哈希函数在MD4的基础上增加了数学运算的复杂程度,即SHA=MD4+扩展转换+附加轮+更好的雪崩效应(哈希值中,为0的比特和为1的比特,其总数应该大致相等;输入数据中一个比特的变化,将导致哈希值中一半以上的比特变化,这就叫做雪崩效应)。SHA能够产生160位的哈希值。对SHA还没有已知的密码攻击,并且由于它产生的哈希值位数长于MD5,所以它能更有效地抵抗穷举攻击(包括生日攻击)。

但是,任何一种算法都有其漏洞和局限性。任何一个哈希函数都会存在碰撞——即在一些特定情况下,两个不同的文件或信息会指向同一个数字摘要。在一般情况下,类似碰撞只能尽可能地减少,而不能完全避免。从理论上讲,没有攻不破的密码。随着密码科学的发展,也许会找到攻破某一种密码算法的途径。

评价Hash算法的一个最好方法是看敌手找到一对碰撞消息所花的代价有多高。一般地,假设攻击者知道Hash算法,攻击者的主要攻击目标是找到一对或更多对碰撞消息。目前已有一些攻击Hash算法和计算碰撞消息的方法。在这些方法中,有些是一般的方法,可用于攻击任何类型的Hash算法,比如“生日攻击”;而另一些是特殊的方法,只能用于攻击某些特殊的Hash算法,比如适合于攻击具有分组链结构Hash算法的“中间相遇攻击”,适用于攻击基于模运算的Hash函数的“修正分组攻击”。坚固的哈希函数可通过设计有效的碰撞处理机制,或增加数字摘要的位数来增加复杂度,以减少碰撞出现的概率,

2004年8月17日,在美国召开的国际密码学会议(Crypto’2004)上,一些国家的密码学者作了破译Hash函数的新进展的报告,其中我国山东大学的王小云教授做了破译MD5、HAVAL-128、MD4、和RIPE MD算法的报告。

到2005年2月,据王小云教授的研究报告,他们已经研究出了搜索SHA-1碰撞的一系列新技术。他们的分析表明,SHA-1的碰撞能在小于2^69次Hash操作中找到。对完整的80轮SHA-1的攻击,这是第一次在小于2^80次Hash操作这个理论界限的情况下找到碰撞。根据他们的估计,对于缩减到70轮的SHA-1能够用现在的超级计算机找出“实碰撞”。他们的研究方法,能自然地运用到SHA-0和缩减轮数的SHA-1的破译分析上。

2005年3月6日,Arjen Lenstra,王小云,Benne de Weger 宣布,他们构造出一对基于MD5 Hash函数的X.509证书,产生了相同的签名。他们提出了一种构造X.509证书的方法,在他们所构造出的证书对中,由于使用了MD5算法,签名部分产生了碰撞。因此,当证书发布者使用MD5作为Hash函数时,发布者就会在证书中产生相同的签名,导致PKI的基础原理遭到可信性破坏。这意味着,从单独某个证书无法确定是否存在另一个不同证书有着相同的签名。由于第二个相同签名证书存在的可能性,证书发布机构无法验证私钥的“拥有证明”,即无法验证证书中的签名。因此,使用“基于MD5函数”公钥证书的任何一方都无法确保所谓的证书拥有者是否真实拥有相应的私钥。

他们也想构造一对基于SHA-1的X.509证书,产生相同的签名。然而,他们还做不到这一点。因为产生SHA-1碰撞还需要相当长一段时间的研究。

专家指出:A.Lenstra和王小云等人声称已经成功地构造了两张符合X.509证书数据结构,拥有同样签名而内容却不同的证书,但该构造方法对证书的部分域要有特殊安排,签名算法RSA的密钥也是按照特殊规律生成的,要用来攻击某个实际应用的电子签名系统仍需时日。而对于SHA-1算法,说其从理论上被破解都还为时过早,只能说其破解工作取得了重大突破,破解所需要运算次数已从原来设计时估算的2^80次降低为2^69次,这比穷举法快了2048倍,但2^69次运算需要6000年左右的时间,在实际计算上仍然是不可行的。

除了运算方面的瓶颈外,哈希函数的不可逆性决定了攻击者无法轻易得手,没有人可以保证通过这个发现的每个碰撞都是“可用”的碰撞。在漫长的运算后,你得到的也许包含一些有价值的信息,也许就是理论上存在的单纯碰撞,运算瓶颈和信息匮乏都会使黑客们的种种努力成为徒劳……据业内人士估计,在当前的技术条件下,2^50或2^ 60次运算量的范围内的攻击方法才会为我们带来麻烦,即引发实际意义上的攻击行为。在新研究成果发布前的一段时间内,SHA-1 算法只能被称作不完美,但还是安全的。基于PKI技术进行电子签名的最终用户,目前还不用担心自己的签名被伪造或遭遇签名人抵赖。

另外,安全专家强调:一种算法被破译,和整个企业的安全系统被攻破,是两个不同的概念。因为随着攻击技术和能力的提高,算法也会“水涨船高”,向前发展进步。王教授所取得的成就提醒密码学家研究新的算法,提醒有关标准化机构要提前修改算法标准,也提醒有关CA和电子签名产品开发商支持新的算法。当然,有些完全基于摘要算法的密押系统和电子货币系统,还需要尽早考虑替换方案。

相关文档
最新文档