哈希算法

哈希算法

試著忘記壹切 提交于 2020-01-15 06:19:50
哈希算法 /*--> */ /*--> */ 哈希算法 什么是哈希算法 哈希算法的应用 应用一:安全加密 应用二:唯一标识 应用三:数据校验 应用四:负载均衡 应用五:数据分片 应用六:分布式存储 哈希算法 什么是哈希算法 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法) 对输入数据非常敏感,哪怕原始数据只修改了一个Bit,最后得到的哈希值也大不相同 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。 哈希算法的应用 应用一:安全加密 说到哈希算法的应用,最先想到的应该就是安全加密。最常用于加密的哈希算法是MD5(MD5 Message-Digest Algorithm,MD5消息摘要算法)和SHA(Secure Hash Algorithm,安全散列算法)。 对用于加密的哈希算法来说,有两点格外重要。第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要很小。 第一点很好理解,加密的目的就是防止原始数据泄露,所以很难通过哈希值反向推导原始数据,这是一个最基本的要求。所以我着重讲一下第二点。实际上,不管是什么哈希算法,我们只能尽量减少碰撞冲突的概率,理论上是没办法做到完全不冲突的。 没有绝对安全的加密。越复杂、越难破解的加密算法,需要的计算时间也越长。比如SHA

极客时间课程《数据结构与算法之美》笔记07 - 哈希算法

故事扮演 提交于 2020-01-14 06:02:10
哈希算法-如何防止数据库中的用户信息被脱库 定义和原理: 将任意长度的二进制值串映射为固定长度的二进制值串 要求: 不能反向推导(单向哈希算法) 对输入数据敏感,哪怕只修改了一个Bit,最后得到的哈希值也大不相同。 散列冲突概率要很小。 执行效率要高,针对较长的文本,也能很快地计算出哈希值。 哈希算法的应用很多,常见有: 安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储 唯一标识 在海量的图片信息中,搜索一张图是否存在。任何文件在计算机中都可以表示成二进制码串,将图片的二进制码串开头、中间、结尾分别取100个字节,然后再通过哈希得到唯一标识。(减轻工作量) 数据校验 BT下载的时候会做数据校验。 散列函数 防范字典攻击 引入一个盐(salt),跟用户密码组合在一起,增加密码复杂度,然后用组合后的字符串来做哈希算法加密,将它存储到数据库中,进一步增加破解的难度。 除此之外,一些公司采用的方法:无论密码长度多少,采用计算hash时间都固定或者足够慢的算法,比如: PBKDF2WithHmacSHA1。避免因计算时间不一样而泄露字符串长度信息。 负载均衡 负载均衡需要维护一个映射表,哈希算法能很方便地维护这个功能,通过客户端IP或者会话ID计算哈希,通过和服务器列表的大小进行取模运算,最终得到服务器编号。 数据分片 统计“搜索关键词”出现的次数,1T的文件日志

几种加密算法

别说谁变了你拦得住时间么 提交于 2020-01-13 16:03:28
1、加密方式分类: 数据加密方式 描述 主要解决的问题 常用算法 对称加密 指数据加密和解密使用相同的密钥 数据的机密性 DES, AES 非对称加密 也叫公钥加密,指数据加密和解密使用不同的密钥--密钥对儿 身份验证 DSA,RSA 单向加密 指只能加密数据,而不能解密数据 数据的完整性 MD5,SHA系列算法 2、加密相关名词解释   HASH:一般翻译为‘散列’,就是指任意长度的输入,通过散列算法,变成固定长度的输出,该输出值就是散列值。这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同输入的可能会散列成相同的输出,而不可能从散列值来唯一的确认输入值。简单的说,hash算法就是一种将任意长度的消息压缩为某一个固定长度的消息摘要的函数。   MD5:全程Message Digest algorithm 5,即信息摘要算法。该算法可以生成定长的数据指纹,被广泛应用于加密和解密技术,常用于文件和数据完整性校验。   SHA:全称为Secure Hash ALgorithm,即安全散列算法/安全哈希算法。该算法为数字签名等密码学应用中的重要工具,被广泛应用于电子商务等信息安全领域。根据生成密文长度而命名的各种具体的算法有1、SHA1(160bits)、SHA224(224bits)、SHA384(384bits)等。   HMAC:全称为Hash Message

哈希算法及其应用场景

淺唱寂寞╮ 提交于 2020-01-12 20:26:32
哈希算法的概念和特性 我们前面分享了散列表、散列函数和散列冲突,其实也可以译作哈希表、哈希函数和哈希冲突,是一个意思。哈希算法简单理解就是实现前面提到的哈希函数的算法,用于将任意长度的二进制值串映射为固定长度的二进制值串,映射之后得到的二进制值就是哈希值(散列值)。 我们日常开发中最常见的哈希算法应用就是通过 md5 函数对数据进行加密了,md5 就是一个哈希函数,结合 md5 我们可以归纳出哈希算法的一般特性: 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向算法,不可逆); 对输入数据非常敏感,哪怕原始数据只修改了一个比特,最后得到的哈希值也大不相同; 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小; 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值 哈希算法的应用 1、场景一:安全加密 日常用户密码加密通常使用的都是 md5、sha等哈希函数,因为不可逆,而且微小的区别加密之后的结果差距很大,所以安全性更好。 2、场景二:唯一标识 比如 URL 字段或者图片字段要求不能重复,这个时候就可以通过对相应字段值做 md5 处理,将数据统一为 32 位长度从数据库索引构建和查询角度效果更好,此外,还可以对文件之类的二进制数据做 md5 处理,作为唯一标识,这样判定重复文件的时候更快捷。 3、场景三:数据校验 比如从网上下载的很多文件

工作量证明及哈希算法

你。 提交于 2020-01-10 02:50:13
什么是工作量证明: 1、工作的结果作为数据加入区块链成为一个区块 2、完成这个工作的人会获得奖励(这也就是通过挖矿获得比特币) 3、整个“努力工作并进行证明”的机制,就叫工作量证明 为什么采用哈希算法: 1、不可逆:无法从一个哈希值恢复原始数据,哈希并不是加密 2、唯一性:对于特定的数据,只能有一个哈希值,并且这个哈希值是唯一的 3、防篡改:改变输入数据中的一个字节,导致输出一个完全不同的哈希 哈希算法特征: 1、正向快速:给定明文和hash算法,在有限时间和有限资源内能计算出hash值 2、逆向困难:给定hash值,在有限时间内很难逆推出明文 3、输入敏感:原始输入信息修改一点信息,产生的hash值会有很大的不同 4、冲突避免:很难找到两段内容不同的明文,使得他们的hash值一致(发生冲突) main.go package main import ( "core" "fmt" "strconv" ) func main() { bc := core.NewBlockChain() bc.AddBlock("Send 1 BC to Ivan") bc.AddBlock("Send more BC to Ivan") for _,block := range bc.Blocks { fmt.Printf("Prev hash: %x\n", block.PrevBlockHash)

一致性哈希算法

↘锁芯ラ 提交于 2020-01-07 17:05:32
一致哈希算法 Consistent Hashing 标签(空格分隔): Java基础 1.场景描述(分布式缓存问题) 有三台缓存服务器sever1,server2,server3,如何读写呢?有如下方法 随机访问 哈希计算(取模法) 一致性哈希 随机访问 每次请求随机发送到一台缓存服务器,策略简单但是会导致问题: 同一份数据可能被存在不同的机器上造成数据冗余 数据已有缓存,但是没有命中 所以,随机策略在时间效率、空间效率上都不是很好。 哈希计算(取模法) 解决相同key访问发送到同一服务器的常用方法->计算哈希。如下 server=Hash(key)%3 这样会解决随机访问导致的问题。但是有产生了新的问题: 容错性:系统中有服务器不可用时,整个系统是否可正确高效运行 扩展性:加入新的服务器,整个系统是否可正确高效运行 假设现在有一台机器宕机了,那么之前的算法就要改为 server=Hash(key)%(N-1) 增加一台服务器,则变为 server=Hash(key)%(N+1) 这会导致无论是增加还是减少服务器都会从新计算Hash。从而导致缓存不命中问题。 一致性哈希 分布式系统每个节点都可能失效,在节点失效或者加入新节点后,如何把对数据的影响降到最低?在分布式缓存中,如果没有好的算法,某个节点失效或者加入新节点后,会对当前缓存的命中率产生巨大的影响。 传统Hash也不是最优解

哈希算法在分布式系统中的应用(极客时间)

别来无恙 提交于 2019-12-28 16:20:26
1.负载均衡 1.1.需求 如何实现一个会话粘滞(session sticky)的负载均衡算法?也就是说,在一次会话中的所有请求都路由到同一个服务器上。 1.2.解决方案 通过哈希算法对客户端IP或会话ID计算哈希值,将取得的哈希值与服务器列表的大小进行取模运算,最终得到的值就是应该被路由到的服务器编号。这样,就可以把同一个IP过来的请求都路由到同一个后端服务器上。 2.数据分片 2.1.如何统计“搜索关键词”出现的次数? ①需求描述 假如我们有1T的日志文件,这里面记录了用户的搜索关键词,我们想要快速统计出每个关键词被搜索的次数,该怎么做呢? ②问题分析 这个问题有两个难点,第一个是搜索的日子很大,没办法放到一台机器的内存中。第二个是只用一台机器来处理这么巨大的数据,处理时间会很长。 ③解决方案 先对数据进行分片,然后采用多台(比如n台)机器进行处理。具体做法:从搜索记录的日志文件中依次读取每个关键词,并通过哈希函数计算该关键词的哈希值,然后跟机器的台数n取模,最终得到值就是该关键词应该被分到的机器编号,这样相同的关键词一定会被分配到同一台机器上,数据分配完成后,由多台机器并行进行统计,最后合并起来就是最终结果。 实际上,这里的处理过程也是 MapReduce 的基本设计思想。 2.2.如何快速判断图片是否存在图库中? ①需求描述 假设现在我们的图库中有1亿张图片

[转帖]从 HTTP 到 HTTPS 再到 HSTS

假装没事ソ 提交于 2019-12-28 08:03:28
从 HTTP 到 HTTPS 再到 HSTS https://linux.cn/article-8856-1.html 作者: 又拍云 | 2017-09-10 17:10 评论: 1 收藏: 5 近些年,随着域名劫持、信息泄漏等网络安全事件的频繁发生,网站安全也变得越来越重要,也促成了网络传输协议从 HTTP 到 HTTPS 再到 HSTS 的转变。 HTTP HTTP(超文本传输协议) 是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是互联网数据通信的基础。它是由万维网协会(W3C)和互联网工程任务组(IETF)进行协调制定了 HTTP 的标准,最终发布了一系列的 RFC,并且在1999年6月公布的 RFC 2616,定义了 HTTP 协议中现今广泛使用的一个版本——HTTP 1.1。 HTTP 访问过程 HTTP 属于 TCP/IP 模型中的应用层协议,当浏览器与服务器进行互相通信时,需要先建立TCP 连接,之后服务器才会接收浏览器的请求信息,当接收到信息之后,服务器返回相应的信息。最后浏览器接受对服务器的信息应答后,对这些数据进行解释执行。 http 1.0 请求模式 HTTP 1.0 时,浏览器每次访问都要单独建立连接,这会造成资源的浪费。 后来HTTP 1.1可以在一次连接中处理多个请求,并且将多个请求重叠进行: http 1.1 请求模式 HTTP

借 redis cluster 集群,聊一聊集群中数据分布算法

◇◆丶佛笑我妖孽 提交于 2019-12-27 18:20:32
Redis Cluster 集群中涉及到了数据分布问题,因为 redis cluster 是多 master 的结构,每个 master 都是可以提供存储服务的,这就会涉及到数据分布的问题,在新的 redis 版本中采用的是虚拟槽分区技术来解决数据分布的问题,关于什么是虚拟槽分区技术我们后面会详细的介绍。在集群中除了虚拟槽分区技术之外,还有几种数据分布的算法,比如哈希算法,一致性哈希算法,这篇文章我们就来一起聊一聊这几种数据分布算法。 因为是集群,所以我们需要一个大前提,在这篇文章中假设 redis cluster 集群中有三台 master,我们需要存储的数据集为: [{id:1,"name":"1"},{id:2,name:"2"},{id:3,name:"3"},{id:4,name:"4"},{id:5:"name":"5"},{id:6,"name":"6"}] ,在这个大前提下,我们来聊一聊集群中的数据分布算法。 哈希算法 哈希算法在分布式架构中应用广泛,不仅仅是数据存储,还有负载均衡等应用上有用的比较多,哈希算法的思想非常简单,也许你知道 HashMap 的哈希函数,哈希算法跟 HashMap 一样,也是通过一个哈希函数得到某一个数字,然后根据数字找到相应的服务器。哈希算法的哈希函数比较简单,一般是根据某个key的值或者key 的哈希值与当前可用的

Java面试准备之算法

a 夏天 提交于 2019-12-27 02:42:38
1、一致性哈希算法 参考文章: 一致性哈希算法 描述: 通过传统哈希算法寻找目标服务器的时候,通常是将哈希值根据目标服务实例的数量来进行取模。例如有3个服务实例,哈希值计算得14,14对3取模得2,则目标服务器的实例为2号服务实例。 传统哈希算法是有弊端的。如果服务的实例数量发生了更改,绝大多数缓存内容的模值会发生改变,此时会发生缓存雪崩。 一致性哈希算法和传统哈希算法的区别在于,一致性哈希算法并不对服务实例的数量取模,而是对一个固定的数字取模,这个数字就是2^32,即无符号整型的最大值。这样得到的哈希数值不会随着服务数量的改变而改变。 对于需要缓存的数据,计算其哈希值,并根据哈希值向下寻找第一个服务器,就是这个数据缓存的目标服务实例。如果寻找到了最大的数值2^32-1,则从0开始继续寻找。 当插入新的服务实例时,受到影响的缓存数据,只有哈希值在从 哈希值小于当前服务实例的第一个服务实例的哈希值,到当前服务实例哈希值之间数据,才会受到影响。 2、LRU算法 LRU(Least Recently Used)即最近最少使用算法。 LRU算法的原理比较简单,数据存储的数据结构为链表。当访问数据时,如缓存中有数据,则将该数据移动至链表的顶端;没有该数据则在顶端加入该数据,并移除链表中的低端的数据。 3、零拷贝 对于“文件拷贝+socket发送”操作,实现方式: 3.1 传统方式: File