hash

Why do salts make dictionary attacks 'impossible'?

送分小仙女□ 提交于 2019-12-27 16:28:52
问题 Update: Please note I am not asking what a salt is, what a rainbow table is, what a dictionary attack is, or what the purpose of a salt is. I am querying: If you know the users salt and hash, isn't it quite easy to calculate their password? I understand the process, and implement it myself in some of my projects. s = random salt storedPassword = sha1(password + s) In the database you store: username | hashed_password | salt Every implementation of salting I have seen adds the salt either at

Why do salts make dictionary attacks 'impossible'?

被刻印的时光 ゝ 提交于 2019-12-27 16:26:02
问题 Update: Please note I am not asking what a salt is, what a rainbow table is, what a dictionary attack is, or what the purpose of a salt is. I am querying: If you know the users salt and hash, isn't it quite easy to calculate their password? I understand the process, and implement it myself in some of my projects. s = random salt storedPassword = sha1(password + s) In the database you store: username | hashed_password | salt Every implementation of salting I have seen adds the salt either at

hashlib模块

大兔子大兔子 提交于 2019-12-27 16:02:04
hashlib模块: 1.>什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法), 该算法接受传入的内容,经过运算得到一串hash值. 2.>hash值的特点是: 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验 不能由hash值返解成内容=======>把密码做成hash值,不应该在网络传输明文密码 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的 理解:hash算法就像是一座工厂,工厂接收你送来的原材料(可以使用,.update()为工厂运送原材料). 经过加工返回的产品就是hash值. # --------------------示例--------------------------------------> import hashlib m = hashlib.md5() m.update('hello'.encode()) print(m.hexdigest()) # 5d41402abc4b2a76b9719d911017c592 m.update('alvin'.encode()) print(m.hexdigest()) #

大数据算法系列——布隆过滤器

て烟熏妆下的殇ゞ 提交于 2019-12-27 12:17:08
一、简介 Bloom filter介绍 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判断。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter比其他常见的算法(如hash,折半查找)极大节省了空间。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 二、算法思想 Bloom-Filter算法的核心思想就是利用多个不同的Hash函数来解决“冲突”。 计算某元素x是否在一个集合中,首先能想到的方法就是将所有的已知元素保存起来构成一个集合R,然后用元素x跟这些R中的元素一一比较来判断是否存在于集合R中;我们可以采用链表等数据结构来实现。但是,随着集合R中元素的增加,其占用的内存将越来越大。试想,如果有几千万个不同网页需要下载,所需的内存将足以占用掉整个进程的内存地址空间。即使用MD5,UUID这些方法将URL转成固定的短小的字符串,内存占用也是相当巨大的。 于是,我们会想到用Hash table的数据结构,运用一个足够好的Hash函数将一个URL映射到二进制位数组(位图数组)中的某一位

Hashable, immutable

僤鯓⒐⒋嵵緔 提交于 2019-12-27 11:08:11
问题 From a recent SO question (see Create a dictionary in python which is indexed by lists) I realized I probably had a wrong conception of the meaning of hashable and immutable objects in python. What does hashable mean in practice? What is the relation between hashable and immmutable? Are there mutable objects that are hashable or immutable objects that are not hashable? 回答1: Hashing is the process of converting some large amount of data into a much smaller amount (typically a single integer)

java核心数据结构总结

こ雲淡風輕ζ 提交于 2019-12-27 11:02:31
  JDK提供了一组主要的数据结构的实现,如List、Set、Map等常用结构,这些结构都继承自java.util.collection接口。 List接口   List有三种不同的实现,ArrayList和Vector使用数组实现,其封装了对内部数组的操作。LinkedList使用了循环双向链表的数据结构,LinkedList链表是由一系列的链表项连接而成,一个链表项包括三部分:链表内容、前驱表项和后驱表项。   LinkedList的表项结构如图:   LinkedList表项间的连接关系如图:      可以看出,无论LinkedList是否为空,链表都有一个header表项,它即表示链表的开头也表示链表的结尾。表项header的后驱表项便是链表的第一个元素,其前驱表项就是链表的最后一个元素。   对基于链表和基于数组的两种List的不同实现做一些比较:   1、增加元素到列表的末尾:   在ArrayList中源代码如下: 1 public boolean add(E e) { 2 ensureCapacityInternal(size + 1); // Increments modCount!! 3 elementData[size++] = e; 4 return true; 5 }   add()方法性能的好坏取决于grow()方法的性能: 1 private

python爬虫 ---Hash算法

那年仲夏 提交于 2019-12-27 07:13:50
Hash算法 1.定义 Hash :散列,通过关于键值(key)的函数,将数据映射到内存存储中一个位置来访问。这个过程叫做Hash,这个映射函数称做散列函数,存放记录的数组称做散列表(Hash Table),又叫哈希表。 简单地说,它是密码学中的一个重要的函数,一般以 表示。这个函数可以将任意一段数据(一般称这段数据为“消息”)压缩成固定长度的字符串(一般称输出的字符串为“摘要”)。哈希函数需要满足下述条件: 确定性:哈希函数的算法是确定性算法,算法执行过程不引入任何随机量。这意味着相同消息的哈希结果一定相同。 高效性:给定任意一个消息m,可以快速计算 目标抗碰撞性:给定任意一个消息m1,很难找到另一个消息m2,使得 广义抗碰撞性:很难找到两个消息m0不等于m1的情况下,使得 2.优点 先分类,再查找,通过计算,缩小范围,加快查找速度 3.Hash的作用 数字签名:给数据打指纹 比如我们下载一个文件,文件的下载过程中会经过很多网络服务器、路由器的中转,如何保证这个文件就是我们所需要的呢?我们不可能去一一检测这个文件的每个字节,也不能简单地利用文件名、文件大小这些极容易伪装的信息,这时候,我们就需要一种指纹一样的标志来检查文件的可靠性,这种指纹就是我们现在所用的Hash算法(也叫散列算法)。 密码存储 在用户进行网站登录时,如果服务器直接存储用户密码,则如果服务器被攻击者所攻击

HashMap工作原理

本秂侑毒 提交于 2019-12-27 04:12:05
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。 1.HashMap介绍 HashMap为Map接口的一个实现类,实现了所有Map的操作。HashMap除了允许key和value保存null值和非线程安全外,其他实现几乎和HashTable一致。 HashMap使用散列存储的方式保存kay-value键值对,因此其不支持数据保存的顺序。如果想要使用有序容器可以使用LinkedHashMap。 在性能上当HashMap中保存的key的哈希算法能够均匀的分布在每个bucket中的是时候,HashMap在基本的get和set操作的的时间复杂度都是O(n)。 在遍历HashMap的时候,其遍历节点的个数为bucket的个数+HashMap中保存的节点个数。因此当遍历操作比较频繁的时候需要注意HashMap的初始化容量不应该太大。 这一点其实比较好理解:当保存的节点个数一致的时候,bucket越少

HashMap并发导致死循环 CurrentHashMap

风格不统一 提交于 2019-12-27 03:49:01
为何出现死循环简要说明 HashMap闭环的详细原因 cocurrentHashMap的底层机制 为何出现死循环简要说明   HashMap是非线程安全的,在并发场景中如果不保持足够的同步,就有可能在执行HashMap.get时进入死循环,将CPU的消耗到100%。   HashMap采用链表解决Hash冲突。因为是链表结构,那么就很容易形成闭合的链路,这样在循环的时候只要有线程对这个HashMap进行get操作就会产生死循环,   单线程情况下,只有一个线程对HashMap的数据结构进行操作,是不可能产生闭合的回路的。   只有在多线程并发的情况下才会出现这种情况,那就是在put操作的时候,如果size>initialCapacity*loadFactor,hash表进行扩容,那么这时候HashMap就会进行rehash操作,随之HashMap的结构就会很大的变化。很有可能就是在两个线程在这个时候同时触发了rehash操作,产生了闭合的回路。   推荐使用currentHashMap 多线程下 [HashMap] 的问题: 1、多线程put操作后,get操作导致 死循环 。 2、多线程 put非NULL元素后,get操作得到NULL值 。 3、多线程 put操作,导致元素丢失 。 HashMap闭环的详细原因 Java的HashMap是非线程安全的,所以在并发下必然出现问题

hash实现查找单词

百般思念 提交于 2019-12-27 01:49:19
不可抗拒力,写得比较慢,主要是室友老拉我打wz,公开处刑! 功能描述 构造一个hash表,对单词来实现O(1)时间的查找。 实现过程 hash函数利用了高低位的hash,自作聪明的加上了位移,啧啧啧,一测试发现冲突打得夸张,加容量也没咋减少,一直以为是再寻址写错了,改了,发现每啥用。后来把左移去掉发现冲突瞬间掉了,现在还没搞清楚为啥。 代码 /** * 利用hashCode进行查找 * * 借用一下网上的hash函数 * unsigned short high = 10086; * unsigend short low = 725; * while(i < lenth) * high = (high << 4) ^ (a * (i + lenth)); * low = (low << 3) ^ (a * (lenth - i)); * * return ((hight << 16) | low ) % size; * ps:经过测试,发现赋值给high和low并没有什么作用 * 而位移操作则会起到反作用,也就是说更好的hash函数应该是下面的 * unsigned short high = 0; * unsigend short low = 0; * while(i<lenth) * high = high ^ (a * (i + lenth)); * low = low ^ (a