数据在网络传输过程中,可能被黑客修改,也可能被植入木马。为了验证我们所下载接受到的数据是原来的数据,可以使用MD5.
MD5或者SHA
任何数据都可以通过散列,生成一个独一无二的128位的数字。这就是MD5的算法。所以使用MD5对某个文件进行计算,可以得到这个文件对应的MD5码。128位的二进制MD5码又可以使用16位十六进制的字符来表示。任何数据都可以使用MD5算法计算出唯一的MD5码。如果数据改变了,那相对应的MD5码也会改变。但是通过MD5码却无法反推出原来的数据.SHA与MD5原理与使用方法相同,只是散列算法不同.
数据--->MD5算法----->MD5码
很多文件下载网站都提供下载文件的MD5码。这样你在下载完文件以后,可以使用MD5校验工具,对下载的文件进行计算。
下载网站上的文件 ------------- 网站公布的MD5码下载后的文件------MD5校验器---------------MD5码
把你的MD5码和网站公布的MD5码进行对比,如果一样,说明你的数据没有被篡改。
前段时间CSDN等各大网站密码泄露事件发生,这是因为有的网站使用明文密码存储。也就是说,它们把用户的密码存在了数据库中。一旦黑客侵入了数据库,用户的密码就泄露了。所以,有很多网站对密码进行MD5计算,然后把MD5码存放入数据库。这样,黑客即使得到了你的密码的MD5码,他也无法推出你的密码。
用户注册 –> 密码 -> MD5码 –>数据库用户登录 –> 输入的密码 –>MD5输入值,跟数据库的MD5码比对.
网站永远没有你的密码,它只存放你的密码的MD5码。如果你的密码丢失,你无法找回密码。网站会随机给你生成一个密码,发到你的邮箱,你使用随机密码登陆,然后重设自己的新密码。
现在,MD5也不安全了,MD5可以被暴力的破解。尤其是对于密码这种字符长度特别短的。所以,黑客拿到你的密码MD5码后,还是可以反推出你的密码的。这时候需要网站对MD5进行改进。新的方法被称为salt。意思是往MD5码上撒盐。假设每个用户被随机分配一段字符串,这段字符串将伴随用户的账户生命周期.这段字符串被称为salt.以java为例:
MessageDigest md = MessageDigest.getInstance("MD5"); md.update(password.getBytes()); md.update(salt.getBytes()); byte result[] = md.digest();由于MD5中撒了盐,这使得黑客无法反推出真正的密码.
RSA
MD5针对静态文件是合适的,但对于动态文件,MD5则不安全。所谓动态文件是动态产生的文件或内容,服务器在用户请求之前,都不知道这个文件是什么样子的,所以也不会有此文件的MD5码。只有当用户请求过来,服务器才通过计算动态产生了一个文件发送给用户。所以,文件的MD5码也是跟着文件一起动态产生的。这样子就无法提前把正确的MD5码公布给用户了。一个文件在传输过程中,可能和MD5码一起都被黑客替换。
这时候需要RSA,非对称的加密解密算法。RSA可以产生两个Key,一个key称为private key,由服务器保管,另一个key为public key,公开给所有人。RSA的算法如下: 一段明文 ---->使用private key加密---->加密后的数据----->使用public key解密----->恢复后的明文
使用private key加密后的数据只能通过public key来恢复,任何key都无法模仿private key加密后的数据。由此,服务器传输一段信息给用户,可以先使用private key加密,把加密后的数据传给用户。 用户收到数据,使用服务器公开的public key进行解密,恢复明文。
由于RSA加密效率很慢,所以对于一些可以被别人看到但不能被别人修改的明文,使用MD5+RSA的方式进行加密:
服务器端: 明文 --- 计算出MD5码 ------ 对MD5码进行RSA加密---- 发送明文和RSA加密后的MD5码 客户端: 接受明文和RSA加密后的MD5码 ---- RSA解密获取MD5码 ---- 对接受明文计算MD5码 -----对比解密后的MD5码和根据明文计算出的MD5码。SSL
有时候访问一个网站的登陆页面,会发现网址起始策略为https://.这是因为服务器端对此资源开启了SSL的传输模式. SSL是一种传输保护机制,防止数据泄露.常用于登陆页面. SSL下的服务器和客户端使用的便是RSA算法对数据加密.SSL还包含了如何产生和交换key的方法.在firefox下面,你会收到一个提示,是否接受服务器发过来的认证证书,里面包含了服务器的public key.当点击接受,就拥有了服务器的public key,也就能解密服务器发过来的加密后的信息了. 客户端也会产生一个把自己的public key传输给服务器,客户端向服务器发送消息将使用自己的private key加密,然后服务器用客户的public key来解密.