通讯双方使用同一个密钥
,使用加密算法配合上密钥来加密,解密时使用加密过程的彻底逆过程配合密钥来进行解密。算法
原始字符:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密码字符:BCDEFGHIJKLMNOPQRSTUVWXYZA
原始书信:I love you
加密书信:J mpwf zpv
解读后:I love you
这里的算法就是每一个字符采用后一位的字符替换,密钥就是原始的英文字母表
。数据库
由于加密和解密都用的相同的密钥,若是密钥再传输过程当中被截获,那么信息很容易就会被破解甚至伪造身份(如网络通讯过程当中,A和B是两个不认识的用户要通讯,那么A要把密钥先传给B再开始通讯,这样B在接收密钥的过程当中可能被第三方劫持从而形成密钥的泄露,第三方取到密钥后即可以破解加密信息)。数组
拿到一组或多组原文-密文对 设法找到一个密钥,这个密钥能够将这些原文-密文对中的原文加密为密文,以及将密文解密为原文的组合,即为成功破解。反破解
让破解者找不到穷举法(暴力破解法,能够理解为一个一个尝试)更有效的破解手段,并 且穷举法的破解时间足够长(例如数千年,那么认为不可破解)。安全
使用公钥对数据进行加密获得密文;使用私钥对数据进行解密获得原数据,加密解密用的算法相同,公钥私钥互相是可解的
(因此能够用于数字签名技术,但双方不能替换,由于公钥是要暴露出去的,是能够被劫获的)。网络
原数据:110 ---->加密算法都是普通的加法 公钥是加4,私钥是加6
加密数据:554
解密数据:111110 ---->去掉每一个的第一位,得出原数据110(注意:溢出是知足非对称加密一个很重要的条件)。性能
因为私钥和公钥互相可解,所以非对称加密还能够应用于数字签名技术(主要是为了验证数据的来源,也就是要肯定是我给你发的数据而不是别人给你发的数据,防止数据被篡改被伪造
)。
发送方用自身私钥加密,接收方获取签名数据后用发送方的公钥解密(验证)获取原数据,而后用获取的原数据和发送来的原数据比对是否一致,一致则证实数据是从目标发送过来的。网站
一般会将原数据作hash处理后再加密,下降原数据签名后的数据大小
(例如你要传10G大小的文件,那么原数据10G,做为比对的签名数据难道也要放10G吗?不能这么作,很是消耗流量和速度。因此直接对文件的hash值进行签名,最后比对hash值便可)。加密
为何签名验证能够证实数据的来源是安全的(也就是是我发的而不是别人伪发或伪造的) 模拟场景: 伪造方换原数据-->签名数据验证之后的Hash和伪造数据的Hash不相同,验证失败。 伪造方换原数据和签名数据-->公钥验证后的数据和被换数据的Hash不符,验证失败。(由于签名数据是用的换数据方自身私钥签名的,只有与其对应的公钥能够还原回原Hash值,但此时用的仍是原数据方的公钥去作的验证,因此公钥解密后获得的并非伪造数据的Hash值)。 综上:信息是没有被伪造可能的。
使用非对称加密通讯,能够在不可信网络上将双方的公钥传给对方,而后在发消息前分别对消息使用 对方的公钥来加密和使用自身的私钥来签名,作到不可信网络上的可靠密钥传播及加密通讯。
A和B通讯,首先B要把本身的公钥发给A,A用B本身的公钥加密数据传给B,B再用本身的私钥解密。可是公钥由于是暴露的,可能被C得到,那么C获取B的公钥后彻底能够本身发伪造消息给B,因此A和B通讯的时候B须要知道信息是A发送的,因此通讯中A会把自身的公钥发给B,再发送数据的时候对数据用自身的私钥加密,由于公钥私钥互相可解,发送到B后B用A的公钥去解密,比对用B公钥加密B私钥解密和A私钥加密(签名)A公钥解密(验证)的数据结果是否一致,若是一致则证实是A发送的数据而不是别人篡改过的数据。spa
能够在不安全网络上传输密钥,公钥别人拿到也没用,由于他没有私钥没法解数据,而私钥又不会传给别人只是自身持有,没有泄露的风险 。code
计算复杂,所以性能相比对称加密差不少。
和对称加密不一样之处在于,非对称加密的公钥很容易得到,所以制造原文-密文对是没有困难的事 因此,非对称加密破解的关键只在于,如何找到找到正确的私钥,能够解密全部通过公钥加密过的密文。找到这样的私钥即为成功破解 因为非对称加密的自身特性,怎样经过公钥来推断出私钥一般是一种思路(例如 RSA),但每每 最佳手段依然是穷举法,只是和对称加密破解的区别在于,对称加密破解是不断尝试本身的新密钥是否能够将拿到的原文-密文对进行加密和解密,而非对称加密是不断尝试本身 的新私钥 是否和公钥互相可解。
把任意数据转换成指定大小范围(一般很小,例如 256 字节之内)的数据。
从数据中提出摘要信息
,所以最主要用途是数字指纹。 (也就是根据数据的全部特征
算出一个值)。
public class A{ private String name; private int age; private void hashCode(){ //只是举一个例子,实际中的hashCode计算要比这个复杂不少,由于要尽可能减小Hash碰撞的几率. return name.length()+age; } }
例如 Java 中的 hashCode() 方法。
怎么重写 hashCode 方法?
把 equals() 方法中的每一个用于判断相等的变量都放进 hashCode() 中,一块儿生成一个尽可能不会碰撞的整数便可 。
为何每次重写 equals() 方法都须要?
由于你要把新的判断条件放进 hashCode() 。
特别注意:hashCode相同不表明对象相同,由于它只是数据的特征值,equals方法相同对象才是同样的,但hashCode能够用于**快速检查对象**是否相同,毕竟hashCode只是一个值的比较,而equals是多个值的比较。
从网络上下载文件后,经过比对文件的 Hash 值(例如 MD五、SHA1),能够确认下载的文件是否有损坏。若是下载的文件 Hash 值和文件提供方给出的 Hash 值一致,则证实下载的文件是无缺无损的。
HashMap(经过hashCode/Map的长度-1算出一个余数,根据余数确认在数组中的index位置,参考HashMap源码)。
当重要数据必须暴露的时候,有时能够选择暴露它的 Hash 值(例如 MD5),以保障原数据的安全。 例如网站登陆时,能够只保存用户密码的 Hash 值,在每次登陆验证时只须要将输入的密码的 Hash 值和数据库中保存的 Hash 值做比对就好,网站无需知道用户的密码。这样,当网站数据失窃时,用户不会由于自身的密码被盗致使其余网站的安全也受到威胁(有可能设置的密码都是相同的)。
不是(划重点!!!)
。Hash 是单向过程,没法进行逆向恢复操做(10G的文件进行hash后可能hashcode只有几KB大小,那么这几KB怎么可能恢复成10G的原文件呢),所以 Hash 不属于加密。(MD5不是加密!!)