Loading [MathJax]/jax/input/TeX/config.js
社区首页 >问答首页 >散列-数字签名和琐碎扩展

散列-数字签名和琐碎扩展
EN

Cryptography用户
提问于 2015-02-13 09:09:15
回答 1查看 201关注 0票数 1

两个非常基本的问题:

1.数字签名

为什么不能简单地替换请求中的散列值?

示例:

代码语言:javascript
代码运行次数:0
复制
 - Mallory creates two different documents A and B, that have an
   identical hash value (collision).
 - Mallory then sends document A to Alice, who agrees to what the
   document says, signs its hash and sends it back to Mallory.
 - Mallory copies the signature sent by Alice from document A to
   document B. Then she sends document B to Bob, claiming that Alice
   signed the other document (document B).
 - Because the digital signature matches the document hash, Bob's
   software is unable to detect the modification.

参考资料:http://en.wikipedia.org/wiki/Collision_攻打

它没有被传输,一个秘密,同时你只是发送哈希最终?这是怎么回事?

哈希函数对于数据签名也是很好的。例如,如果您使用的是HMAC,则可以使用与已知但不是传输的值(秘密值)连接的数据哈希来签名数据。所以你发送纯文本和hmac哈希。然后,接收器简单地用已知值对提交的数据进行散列,并检查它是否与发送的hmac匹配。如果是一样的话,你知道它没有被一个没有秘密价值的人篡改。这通常用于HTTP框架的安全cookie系统中,以及在您希望数据具有一定有效性的HTTP上进行数据的消息传输。

参考资料:https://stackoverflow.com/questions/4948322/fundamental-difference-between-hashing-and-encryption-algorithms

2.数字签名

我不明白为什么这段代码产生的颜色比第二段要少,当您与两个输入发生冲突时,如何帮助为下一个递归循环追加相同的两个值?

不建议:

代码语言:javascript
代码运行次数:0
复制
hash = sha512(password + salt); 
for (i = 0; i < 1000; i++) {
    hash = sha512(hash); // <-- Do NOT do this!
}

推荐:

代码语言:javascript
代码运行次数:0
复制
hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
    hash = sha512(hash + password + salt);
}

我读了五遍这部分,虽然有点道理,但我很难完全理解它。

现在,hash1的碰撞概率为0.001%。但是,当我们执行下一个hash2 = sha1( hash1 );时,hash1的所有冲突都会自动变成hash2的冲突。所以现在,我们有0.001%的哈希1‘S率,第二次sha1呼叫增加了这一点。

参考资料:https://stackoverflow.com/questions/4948322/fundamental-difference-between-hashing-and-encryption-algorithms

EN

回答 1

Cryptography用户

回答已采纳

发布于 2015-02-13 09:52:42

对问题2的答复:

算法1:将算法改为此算法,将更容易解释。

代码语言:javascript
代码运行次数:0
复制
hash1 = sha512(password + salt1); 
hash2 = sha512(password + salt2); 
for (i = 0; i < 1000; i++) {
    hash1 = sha512(hash1); // <-- Do NOT do this!
    hash2 = sha512(hash2); // <-- Do NOT do this!
}

对于两个不同的输入( hash1和hash2 ),如果迭代10上有冲突,那么接下来的990次迭代将处理相同的工作,并输出相同的hash1和hash2。

哈希越多,在迭代12、15、20、100、101、314中创建的中间冲突就越多.每增加一次迭代,就会增加碰撞的概率。

如果Bob运行此代码(前一个循环的一半)

代码语言:javascript
代码运行次数:0
复制
hash1 = sha512(password + salt1); 
for (i = 0; i < 1000; i++) {
    hash1 = sha512(hash1); // <-- Do NOT do this!
}

如果Alice运行此代码(前一个循环的一半)

代码语言:javascript
代码运行次数:0
复制
hash2 = sha512(password + salt2); 
for (i = 0; i < 1000; i++) {
    hash2 = sha512(hash2); // <-- Do NOT do this!
}

与之前的评论相比,安全性降低了,因为Bob和Alice可以相互模仿,因为碰撞的概率增加了。当算法完成后

代码语言:javascript
代码运行次数:0
复制
P(hash1 == hash2) > 1000 * P(sha512(password + salt2) == sha512(password + salt1) )

如果有超过鲍勃和爱丽丝,约翰,乔,杰克和杰里米运行这个循环,那么碰撞的概率仍然增加了破坏性的影响“生日悖论”。

算法2:每一次迭代都有不同的地方,这是很大的区别。

代码语言:javascript
代码运行次数:0
复制
hash1 = sha512(password + salt1);
hash2 = sha512(password + salt2);
for (i = 0; i < 1000; i++) {
    hash1 = sha512(hash + password + salt1);
    hash2 = sha512(hash + password + salt2);
}

如果迭代i有冲突,那么下一个迭代i+1更有可能产生非冲突。当提供不同的输入时,每一次迭代都具有非常低的sha512碰撞概率。当算法完成时,Bob和Alice将算法拆分

代码语言:javascript
代码运行次数:0
复制
P(hash1 == hash2) == P( sha512(password + salt2) == sha512(password + salt1) )

注意:可能在每次迭代时都有不同的salt值,正如引用的页面所建议的那样。

票数 2
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/22932

复制
相关文章
散列查找和哈希查找_散列检索
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。建立了关键字与存储位置的映射关系,公式如下:
全栈程序员站长
2022/11/15
8990
散列/散列函数「建议收藏」
每个关键字被映射到从0-TableSize-1这个范围中的某个数,并且被放到适当的单元中。这种映射就叫做散列函数
全栈程序员站长
2022/08/28
8920
散列/散列函数「建议收藏」
散列算法与散列码
一、引入 1 /** 2 * Description:新建一个类作为map的key 3 */ 4 public class Groundhog 5 { 6 protected int number; 7 8 public Groundhog(){ 9 } 10 public Groundhog(int number) 11 { 12 this.number = number; 13 } 14 15 @Overr
JMCui
2018/03/15
1.5K0
散列算法与散列码
Hash(散列)冲突解决 线性探测再散列和二次探测再散列
例如  哈希函数为: H(key) =  key %13,key 为关键字,采用开放地址法中的线性探测再散列解决冲突,依次输入
用户2965768
2018/12/28
16.6K0
散列
将一个元素的关键码和存储位置之间建立对应的函数关系 Hash( ), 使得每个关键码与结构中的唯一的存储位置相对应:
Rikka
2022/02/07
1.8K0
散列
选择键值,冲突的时候采取不同的策略 散列函数: 简单的散列函数: 1 int hash(const string & key,int tableSize) 2 { 3 int hashVal = 0; 4 for(int i = 0; i < key.length();++i) 5 { 6 hashVal + = key[i]; 7 } 8 return hashVal % tableSize; 9 } 比较好的散列函数: 1 int hash( c
用户1154259
2018/01/17
8140
分离链接的散列散列代码实现
散列 散列为一种用于以常数平均时间执行插入,删除和查找的技术。一般的实现方法是使通过数据的关键字可以计算出该数据所在散列中的位置,类似于Python中的字典。关于散列需要解决以下问题: 散列的关键字如何映射为一个数(索引)——散列函数 当两个关键字的散列函数结果相同时,如何解决——冲突 散列函数 散列函数为关键字->索引的函数,常用的关键字为字符串,则需要一个字符串->整数的映射关系,常见的三种散列函数为: ASCII码累加(简单) 计算前三个字符的加权和$\sum key[i] * 27^{i}$ (不太
月见樽
2018/04/27
1.5K0
Hash散列[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/146553.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/27
6720
散列冲突
概念:如果当一个元素被插入时与一个已经插入的元素散列到相同的值, 那么就会产生冲突, 这个冲突需要消除。解决这种冲突的方法有几种:本章介绍两种方法:分离链接法和开放定址法
全栈程序员站长
2022/08/27
5950
文本的DES加密 MD5散列值 DSA的数字签名
作者:未知文本的DES加密为了对称加密的安全,将密码进行封装,先新建一个用于保存密码的类库cl:usC#
Java架构师必看
2020/10/26
7500
散列函数
散列的概念属于查找,它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,查找的期望时间为O(1)。
233333
2019/09/24
9200
散列查找
散列同顺序、链接和索引一样,是又一种数据存储方法。散列存储的方法是:以数据集合中的每个元素的关键字k为自变量,通过一种函数h(k)计算出函数值,把这个值用做一块连续存储空间(即数组或文件空间)中的元素存储位置(即下标),将该元素存储到这个下标位置上。散列存储中使用的函数h(k)被称为散列函数或哈希函数,它实现关键字到存储位置(地址)的映射(或称转换),h(k)被称为散列地址或哈希地址;使用的数组或文件空间是对数据集合进行散列存储的地址空间,所以被称为散列表或哈希表。在散列表上进行查找时,首先根据给定的关键字k,用与散列存储时使用的同一散列函数h(k)计算出散列地址,然后按此地址从散列表中取出对应的元素。
全栈程序员站长
2022/08/27
1.2K0
散列查找
浅谈散列运算
“指纹”一词形象地描述了散列运算的结果。在现实生活中,两个人可能长得很像,但是他们的指纹不同,根据指纹就能对这两个人进行区分。
小蜜蜂
2019/07/24
1.1K0
浅谈散列运算
C++ —— 哈希详解 - 开散列与闭散列
1. 从发⽣冲突的位置开始,依次线性向后探测,直到寻找到下⼀个没有存储数据的位置为⽌,如果⾛到哈希表尾,则回绕到哈希表头的位置(回绕方法就是进行取模)
迷迭所归处
2024/11/19
460
C++ —— 哈希详解 - 开散列与闭散列
单向散列函数
如果你需要从国外的网站上下载一个软件,但是因为种种原因,国外的网络太慢了,下载几个G的数据几乎是不可能的。刚好国内有镜像网站,可以从国内下载数据。但是如何保证国内的镜像不是被篡改过后的呢?这个时候就需要单向散列函数了。一般来说网站会提供MD5或者SHA的值作为验证值。
程序那些事
2020/07/08
7940
hash散列 introduction
hash散列是在记录的存储位置与他的关键字之间建立的对应关系f, 使得每个key都对应一个存储位置, 查找时根据key的hash去查找.
CoffeeLand
2020/03/26
5390
查找-散列查找
散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上。
全栈程序员站长
2022/08/28
1.4K0
查找-散列查找
Python:说说字典和散列表,散列冲突的解决原理
散列表其实是一个稀疏数组(总是有空白元素的数组称为稀疏数组)。在一般书中,散列表里的单元通常叫做表元(bucket)。在 dict 的散列表当中,每个键值对都占用一个表元,每个表元都有两个部分,一个是对键的引用,一个是对值的引用。因为每个表元的大小一致,所以可以通过偏移量来读取某个表元。
丹枫无迹
2019/03/15
2K0
hashmap 的重新散列和装载因子
HashMap 的装载因子是 0.75,用人话说就是当 HashMap 的容量达到定义容量的 75% 的时候,HashMap 会进行扩容,当 HashMap 进行扩容的时候就会重新散列(rehashing)。
HoneyMoose
2022/11/30
5930
hashmap 的重新散列和装载因子
【C++进阶】哈希表开散列和闭散列的模拟实现(附源码)
闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有 空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去。
aosei
2024/01/23
1760
【C++进阶】哈希表开散列和闭散列的模拟实现(附源码)

相似问题

散列密钥扩展

10

可扩展散列函数

10

为什么使用私钥加密数字签名中的散列

10

数字签名应用中使用中间散列优于全散列的优点

20

AES密钥扩展与散列

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文