您的位置:首页 > 其它

加密相关的一些理论知识

2016-08-30 13:16 197 查看
加密相关的知识:

加密方式:MD5,SHA1值,RSA,DES

MD5,SHA1值是数字摘要算法,根据算法不同,摘取里面某一段数据,生成固定长度的16进制的值,但它不属于加密
MD5是生成的32位的十六进制,SHA1是生成的40位的十六进制值,现在比较多的是用的32位的,就是128bit,
SHA1值是160bit
用途:就是校验数据的完整性,我们只要对这个文件做了一丁点的修改,它的签名就不一样了,所以可以
    通过这种算法校验数据的是否完整.  

    另外一个用途就是用于密码的传输和保存,也就是说我们提交给服务器的密码,你输入的是123,但是它保存的不是123.它保存的是
    123的签名.那它怎么验证你登录成功呢?其实就是你输入密码的时候会生成一个MD5值,它会把这个值与数据库里面保存的那个值
    进行对比,发现是一样的,就证明你登录成功了

对称加密:加密和解密使用相同的密钥,就是说你用123加密,就需要用123解密,当然也可以使用两个简单的相互推算的密钥,什么意思呢,就是比如说
可以用密钥A推算出密钥B
对称加密常见算法:DES,AES常见,其它的RC5,RC6就不是很常见.使用方式:当你需要用到它的时候你得告诉加密器你使用的是什么加密方式
优势:加密解密速度快,对资源消耗小,因为它的算法不是那么的复杂,它加密和解密都是用的一个密钥,直接反向推一下就可以推回来
缺点:无法保证密钥传输过程中的安全性!那怎么解决的呢?在下面的HTTP请求中会说到

非对称加密:加密解密由公钥和私钥完成,公钥是公开出去的,私钥是自己保存的

非对称加密常见算法:RSA,当然还有一些别的算法,比如背包算法之类的
 RSA算法就是一套算术题
 RSA算法包含5个算法:KeyGen,密钥生成算法,调用它的某一个工具或者某一个算法会生成一对公钥和私钥.公钥和私钥是有一一对应关系的,它俩是有关联关系的,但是虽然它俩有关联关系,你还是无法由公钥推算出私钥,或者是私钥推算出公钥
   Encrypt:加密算法,传入公钥和明文进行加密生成密文,是加密后的数据
   Decrypt:解密算法,传入私钥和密文,生成对应的明文
   Sign:签名算法,接受一个私钥和明文,获取这串明文的签名信息,它是通过私钥进行拿回来的信息
   Verify:验证算法,对应的也是一个数学函数,你告诉它你的公钥,你的签名信息,你的明文,返回来一个结果,1成功,也就是说你给我的这段信息确实是服务器发过来的,数据是完整的,没人篡改的
    0验证失败,客户端自然知道这段数据被篡改了,要提醒用户的

非对称加密的用途:因为它提供了5中算法,那它的用途就广了
a.公钥加密,私钥解密.用于传输数据的加密
b.验签机制,私钥签名,公钥验签.用于传输数据的完整性校验

优点:因为公钥和私钥是密钥生成算法生成的,所以不用进行传输,加密和解密用的不是同一个
缺点:RSA里面的数学计算是非常复杂的,所以说它对性能的要求是非常高的

HTTP请求过程中的数据加密,应用跟服务器传输数据过程中的数据加密

解决应用与服务器,HTTP请求过程中数据的安全传输方式:对称加密+非对称加密,但是这样真的安全嘛?其实还是会受到"中间人攻击"的.是什么原因导致的呢?是客户端接收到的公钥它并不知道这个公钥具体是谁的.那如何避免这个问题呢?那就是我客户端必须要明确的知道我

        服务端的公钥是什么!从开发的角度考虑的话,就是我客户端必须要知道这个公钥的签名信息,如果传过来的公钥的签名是不正确的话,那么就不进行数据的传输了,我肯定要进行一下校验,这是一种方案,我们自己想的方案.

        那有没有比较正规的方案呢?
   这里我们就把角度放到整个网站的层面,说下这个CA证书管理机构.CA证书里面包含了许多东西,有公钥,有域名,有算法这些,当有了这个证书,客户端给服务器发送请求之后,服务器返回一个证书,客户端也不会简单的就拿出这个key就用,它需要验证这个证书的合法性.怎么验证呢?如果是浏览器的话,它是有一个根证书库的,或者是系统,它
也是有自己的一个根证书库的,这个库里面是收集了许多的证书,当然也可以校验自己证书的合法性与否,验证了合法性之后,拿证书里面的公钥加上随机生成的密钥发送给服务端,服务端通过私钥解密出这个对称加密的密钥,后面就通过这个密钥进行传输数据

方式:1.服务器端先生成一对公钥和私钥
    2.客户端发送请求,服务器端把公钥给返回回去
    3.客户端拿到公钥以后,先生成一对对称加密的密钥,随机生成
    4.公钥对对称加密的密钥进行加密发送给服务器,服务器通过私钥解密拿到这个key

HTTPS传输(数据加密交互流程): CA证书的方式:(算法协商阶段)1.客户端发出请求,告诉服务器支持的加密算法,SSL/TLS协议版本号等
        2.服务端选出最终双方都支持的算法和协议回复客户端,并带上服务器的证书(证书里面包含PK公钥)以及要使用的算法和协议,如果它不支持的话,它会重新告诉客户端你有没有别的算法
        3.校验证书的合法性,如不合法提醒用户风险自负
        4.把服务器公钥加密的对称密钥发送给服务器,服务器私钥解密出客户端的对称密钥

HTTPS相比于HTTP多了一层SSL/TLS(安全套接字层)协议,协议就是双方传递数据的规则,就是对传输层进行加密,对TCP/UDP进行加密的

HTTPS对应端口号443

OpenSSL:协议只是一套规则,我们要用的话,得有一套实现,它实现了SSL/TLS协议的包含加密算法,密码库等相关开发工具的软件开发包.
它本来是非常安全的,但去年爆发了"心脏滴血"的这个漏洞

SSH的一些知识点:Secure Shell.常用于远程登录或其他网络服务通讯安全通道的建立.说白了就是验证客户端的合法性,同时要保证你的服务器登录口令的安全性
验证方式:
1.账号密码登录  方式,命令:ssh 你的电脑设置的昵称(例如seny)@你的ipconfig
紧接着执行的步骤:a.客户端给服务器发送登录请求,服务器会返回其公钥,
b.(询问是否信任该服务)客户端如果选择信任,则将公钥保存到本地known_hosts
c.(输入密码登录)数据会被服务器的公钥进行加密传输,这里呢,这段加密的数据又是否是安全的会被传输么?不见得,它又没有CA证书
d.服务器收到数据解密后验证密码成功,建立登录会话.
缺点:每次登录需要输入口令,并且服务器公钥的合法性不容易验证.
2.公钥登录.SSH里面提供公钥的生成,就是用非对称加密里面的KeyGen算法生成一对公钥和私钥,本质上使用的还是RSA算法.
方式:ssh ipconfig
实现的步骤:a.客户端(本地生成公钥和私钥),将PK上传到服务器,保存到PK所属的authorized_keys列表中,这个PK我们可以自己scp,也可以让后台人员手动添加到列表中
 b.客户端请求登录时带着PK请求服务器验证,服务器去authorized_keys查看是否匹配.
 c.如果有匹配的,则将随机生成的数据用该PK加密后发送给客户端.
 d.客户端将收到的密文用SK解密后发送回服务器.
 e.服务器验证数据是否正确,如果正确则建立登录会话.

缺点:登录验证时间较长.
注:如果登录者的账号与服务器账号不一样,客户端可以在.ssh/config里进行配置,配置Host和user.

  另外要求authorized_keys的权限为600,.ssh为700

MD5的使用方式:简单代码,如果在工程中用,可以把它提取成一个工具类

public class Test {

    public static void main(String[] args) throws Exception {

        MessageDigest digest = MessageDigest.getInstance("md5");//MessageDigest是一个加密器

        String password = "123456";

        byte[] result = digest.digest(password.getBytes());

        for (byte b : result) {

            //把byte转换为int类型的值,十六进制

            int number = b & 0xff - 3;//加盐

            Integer.toHexString(number);

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  加密