说起网络安全,最基本的策略就是走https。https仿佛一条神秘通道,有了它,万事无忧。
究竟什么是https?如何实现https? 本文将揭开https的神秘面纱。

WTF https

万事皆有源头。什么是https?首先从安全性需求说起,5大安全需求
  1. 保密(Confidentiality) 。网购越来越普及,网上交易,信用卡和密码无疑要保密。
  2. 完整性(Integrity)。比如下载的软件被人修改,附加上木马病毒。
  3. 认证(Authentication)。最简单的,用户id和password
  4. 授权(Authorization)。比如用户授权容许第三方应用访问平台的(SNS/weibo)个人数据
  5. 不可否认(Non-Repudiation)。你从银行取了一笔钱,你说你没取或者说不是你取的,这便是否认。所以银行会让你出示身份证,并签名单据存根。

密码学(Cryptography)

一首藏头诗

反景流光致承平,清澄玉宇天下晴。复兴我辈何所拒?明日风雨一同行

取诗词每行第一字,即:反清复明。加密,古代的诗歌有木有!

Hello, cryptography

Bob要跟Alice说hello,他并不想让其他人知道。于是他采用了一种方式,每个字母按字母表中的位置往右移2位。hello变成jgnnq,然后经由mary交给Alice。Alice收到后,将每个字母往左移两位,重新得到hello.

    h -> j
    e -> g
    l  -> n
    l -> n
    o -> q

上面这个简单的例子已经包含了对称密码学(Symmetric Ciphers)的基本概念。右移两位为加密(message encryption),左移两位为解密(message decryption)  移位是加密算法(Cipher),2则是密钥(secret key)

Symmetric Ciphers

如前所述, 对称密码学就是使用相同的密钥进行加密与解密。

常见的算法有

Data Encryption Standard (DES):

美国国家联邦1977年指定的标准,以64bit为块(block)来进行加密/解密,key的大小为56bit。随着计算机运算能力的增强,DES被破解的难度逐渐降低。据称,1999年有人使用1万台pc不到一天的时间破解了DES加密的消息。1997年。美国国家标准与技术委员会又推出了AES(Advanced
Encryptoin Standard),通过公开竞赛征集,最终选用了Rijndael的算法。



Two fishRC2...



对称密码学有个很扰人的问题就是key的交换(key management)。通信双方必须采取一种安全的方式来交换密钥,比如通过电话交换--假定电话这个信息通道是安全可靠的。这样我们需要另外一个独立的通道(Channel)来安全的交换key。假如Bob除了和Alice通信,还需要和其他成千上百人进行通信,这时一一交换key变得难以管理和执行。

为了解决这个问题,公钥密码学(Public-key_cryptography)或者是非对称密码学(Asymmetric Ciphers)应运而生。

Asymmetric Ciphers

首先Alice根据一定的算法生成一对钥匙:公钥(public key)和私钥(private key)。公钥公开给所有人,私钥则自己保留。



消息的加密和解密。Bob要向Alice发送消息,他使用Alice的公钥(对所有人可见)对消息加密。Alice收到消息后,使用私钥(仅自己可见)对消息进行解密。



除了消息的加密与解密,公钥和私钥还可用在消息的签名上。Alice使用自己的私钥将消息加密,Bob使用Alice的公钥将其解密,则可验证其消息来自于Alice,而不是别人,否则其无法解密。在后面的数字签名(digit singature)中我们会介绍,除了加密,还必须保证数据的完整性(Integrity).





常见的公钥算法有

RSA: 由 Ron
Rivest
Adi Shamir, and Leonard
Adleman
1978年在论文中提出,RSA即以三人的首字母命名。
为了去掉公钥和私钥加密解密的神秘性,这样复述wiki中的简单例子
  1. key的生成

    • 取两个不同的质数,p=61, q=53
    • 计算n=p*q = 3233
    • 计算两个质数的totient积(61-1)*(53-1)=3120.
      totient是所有小于给定正数且与其互质的自然数个数。
    • 选择一个小于3120且与3120的互质的数, e = 17
    • 计算e对于3120的模块逆数,d=2753. 模块逆数(Modular_multiplicative_inverse)是指 (d*e) mod 3210 = 1
    • 公钥为(n=3233, e=17),私钥为(n=3233, d=2753)
  2. 加密
    • 消息m, 密文为 m^17 mod 3233,例如,消息m=65,c =
      6517 (mod 3233) = 2790
  3. 解密
    • 密文c,明文为 c^2753 mod 3233, 例如,m = 27902753 (mod
      3233) = 65

One-way hash functions

在介绍数字签名之前,我们介绍一下单向hash函数(one-way hash functions)。数据完整性的校验在网络传输和磁盘文件存储中早已有之。校验和(checksum),比如将所有bit进行异或,得到一个bit的校验码,还有循环校验码(CRC)等。这类校验一般是防止电路异常或者磁盘损坏。对于防止人为的篡改,更强劲的单向hash函数呼之而出。



单向hash函数,并不是说原文和hash值是一对一的映射关系,而是给定hash值后,很难找出(破解出)一条消息生成的hash值和其相等。进一步讲,对于单向hash函数,很难找到hash冲突--两条不同的消息产生相同的hash值。



常见的算法有

MD5SHA-1



单单使用hash function并不能保证数据的完整性,窃听者可以连同消息和hash值一同修改。在接下来介绍的数字签名中,对hash值使用私钥进行加密,保证了hash值的安全。

Digital Singature

签名: Alice 使用hash算法生成文档的hash值,然后使用其私钥将hash值进行加密,得到的密文就是数字签名,附加到文档上。



验证:Bob使用相同的hash算法生成文档的hash值;使用Alice的公钥对签名进行解密,得到原hash值,如果两个hash值相同,则表明文档没有被修改,而且该文档由Alice发送。



在数字签名中, 往往将Alice的公钥连同文档一同发给Bob,更准确的说,是将Alice的证书(certificate)连同文档一起发送,如下图。




Certificate

前文说到在数字签名时,Alice(签名者)会将其公钥一同发送。扰人的问题又来了:如何证明文档中的公钥是Alice的公钥?
公钥认证(public key certificate)是将身份(identity)和公钥进行绑定的证明。其采用真实世界中类似的方法,通过一个第三方权威(Certificate Authority)来签定。

假定大家都相信Charlie。Alice将其Public key和自己的身份信息(姓名,地址,web url)发给Charlie。Charlie通过一定的方式(比如派个特派员)验证一切信息无误后,生成一份Certificate文档(见下图)。Certificate文档包含Alice的名字,CA的名字,Alice的网址信息,Alice的公钥,最后一个是Charlie关于上面信息的数字签名。Charile将这份Certificate送回给Alice。在数字签名时,发送者会将认证连同文档、签名一块发送给接收者。接收者首先使用CA(Charlie)的公钥对其certificate进行验证(类同前文数字签名的验证过程),确认公钥和身份一致(见下图)。验证Alice的公钥没问题后,就可以使用Alice的公钥进行前文数字签名的验证(Integrity和Authentication)


假如Mary想将自己的公钥伪装成Alice的公钥(如下图),使用CA(Charlie)的公钥验证后hash值不一致。




Certificate Chain:

前文说Certficate的验证是使用CA的公钥来进行校验。如何保证CA本身的公钥就一定和身份匹配?于是出现了Certicate Chain,如下图:Alice的公钥由Charlie来鉴定,Charlie的公钥又有Victor来签定,而Victor的公钥自己来签发。有自己来签发公钥的CA就叫Root CA。




SSL(Secure Socket Layer)

在实际应用中,对称密码学和非对称密码学往往结合应用。

  • 使用公钥和私钥交换一个共有密钥,这样保证了会话中密钥的安全性;每个人只需要维护自己的一套公钥和私钥,就可以彼此之间任意安全通信,解决了密钥管理的问题。
  • 使用共有密钥来加密与解密消息,这样可以得到更快的加密解密速度。

SSL就是基于上面的思路来构建

SSL HandShake

  • 首先彼此say hello,交换CipherSuites信息(Client hello, Server Hello),商讨下面的协议
    • key exchange algorithm: 如何交换key,以及身份的验证,比如使用RSA公钥证书(RSA public-key certificate)
    • bulk encryption algorithm: 通信中采用的加密算法
    • message authentication code: 完整性验证采用的hash函数
    • pseudorandom function:伪随机数的生成算法 (is used to create the master secret, a 48-byte secret shared between the two peers in the connection)
    • 例如 SSL_RSA_WITH_RC4_128_MD5 (authentication using RSA public-key certificate, data encryption using 128-bit RC4, and data integrity using an MD5 hash).
  • 身份验证,Server将其公钥证书(certificate)发给client;client验证Server身份,确定server的公钥(public key)可靠
  • clicent发送key交换的信息(ClientKeyExchange):可能是个随机数或者preMasterKey,使用server的公钥加密后发给server;client和server使用此随机数(只有双方知道)生成相同的主钥(Master key),之后通信中使用的key values由此主钥生成。
  • ChangeCipherSpec,表示商谈完毕,可以进行消息的加密/解密
  • Finish 从这个消息开始,双方使用商讨的加密函数和共有的密钥进行加密/解密

HTTPS(Hypertext Transfer Protocol Secure)

https即http + ssl。就是在不安全的网络中建立一个安全的信息通道。

浏览器在访问https打头的网址时,进行SSL中的握手,确定好密钥后,所有在网络传输的http请求和响应都是通过加密之后的密文。



在浏览器中,会预装几个root ca(Verisign,GlobalSign)的certificate(证书)。如果一个https网站的certificate不是由这些root
ca来签发,则浏览器无法验证其certificate的有效性,因此弹出诸如你是否信任XX之类的警告。



神秘的java Https的更多相关文章

  1. Java Https双向验证

    CA: Certificate Authority,证书颁发机构 CA证书:证书颁发机构颁发的数字证书 参考资料 CA证书和TLS介绍 HTTPS原理和CA证书申请(满满的干货) 单向 / 双向认证 ...

  2. java https单向认证(忽略认证)并支持http基本认证

    https单向认证(忽略认证)并支持http基本认证, 温馨提示 1,jar包要导入对 2,有匿名类编译要注意 3,欢迎提问,拿走不谢!背景知识 Https访问的相关知识中,主要分为单向验证和双向验证 ...

  3. java https tomcat 单双认证(含证书生成和代码实现) 原创转载请备注,谢谢O(∩_∩)O

    server: apache-tomcat-6.0.44 jdk1.7.0_79client: jdk1.7.0_79 jks是JAVA的keytools证书工具支持的证书私钥格式. pfx是微软支持 ...

  4. package-info.java https://www.intertech.com/Blog/whats-package-info-java-for/

    mybatis-3/src/main/java/org/apache/ibatis/cache/package-info.java What’s package-info.java for? http ...

  5. Java https认证的坑

    https单向认证的服务端证书不是权威机构颁发的,网上找了点代码不对https证书进行认证后,报如下异常 javax.net.ssl.SSLHandshakeException: Received f ...

  6. java Https工具类

    import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import ja ...

  7. java https post请求并忽略证书,参数放在body中

    1 新建java类,作用是绕过证书用 package cn.smartercampus.core.util; import java.security.cert.CertificateExceptio ...

  8. java https

    1. 异常突现 在这普通的一天,我写普通的代码,却突然收到不普通的报警 javax.net.ssl.SSLHandshakeException: server certificate change i ...

  9. Java https ssl证书导入删除

    下载并命名 例如命名github.cer 放进jre的lib\security下 keytool -delete [OPTION]... 选项: -alias <alias> 要处理的条目 ...

随机推荐

  1. HDU 1269 迷宫城堡 (Kosaraju)

    题目链接:HDU 1269 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000), ...

  2. 动态规划-递推-HDU2048

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2048 全错=全不匹配 设当前全错的个数是dp[n] 那么前(n-1)个全错的话,第n个数就可以从前(n- ...

  3. Java笔记——Map集合

    Map集合接口 Map集合与Collection不是从属关系,是平级的 Map集合的映射特点 一个映射不能包含重复的键,由此键只能允许有一个空null 每个键最多只能和一个值对应 值可以重复,由此值允 ...

  4. spring的4种事务特性,4种隔离级别,7种传播行为

    spring事务: 什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务特性(4种): 原子性 (atomicity):强调事务的不可分割. 一致性 (c ...

  5. Redis数据库-基础篇

    Redis Redis是一个开源的,先进的key-value存储. 它通常被称为数据结构服务器,因为键可以包含字符串,哈希,链表,集合和有序集合. Redis 简介 Redis 是完全开源免费的,遵守 ...

  6. 2019 Multi-University Training Contest 1 - 1011 - Function - 数论

    http://acm.hdu.edu.cn/showproblem.php?pid=6588 新学到了一个求n以内与m的gcd的和的快速求法.也就是下面的S1. ①求: $ \sum\limits_{ ...

  7. 【转】通俗理解Java序列化与反序列化

    一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...

  8. c# 获取 Apk ,Aar 文件包名

    最近项目有个需求,需要拿到前端上传的Apk或者Aar文件里面的包名. 在这里贡献出来,方便有需求的小伙伴. 项目是 asp.net core 2.2 需要安装 nuget : AndroidXml S ...

  9. Git相关命令整理

    git config --global user.name  //配置姓名git config --global user.email  //配置邮箱git config --list  //查看配置 ...

  10. vue 移动端列表筛选功能实现

    最近兴趣所致,打算使用vant搭建一个webapp,由于需要使用列表筛选,没有找到合适组件,于是写了一个简单的功能,权当记录. 效果如下:        HTML: <div class=&qu ...