zoukankan      html  css  js  c++  java
  • 数字签名与密码基础

    目录

    背景

    What is a Digital Signature?.

    背景文章大意

    • Bob有两把钥匙,一把是公钥,另一把是私钥。公钥送给Bob的朋友们,Pat、Doug和Susan,私钥自己留着。
    • Susan给Bob写信,写完用Bob公钥加密就可以达到保密效果。Bob用私钥解密,看到信件内容。只要Bob私钥不泄露,信件就安全,即使信件落在别人手上也无法轻易被解密。
    • Bob给Susan回信,采用数字签名写完信后用Hash函数,生成信件的摘要。然后Bob对摘要使用私钥加密,生成数字签名(signature)。
    • Bob将这个签名附在信件下面一起发给Susan,Susan收到信件后取下数字签名,用Bob的公钥解密,得到信件的摘要,由此证明此信件是Bob发出的。
    • Susan对信件本身使用Hash函数,将得到的结果与上一步得到的摘要对比,如果两者一致证明信件内容没被修改过。
    • Doug想欺骗Susan,他偷偷使用了Susan的电脑,用自己的公钥换走了Bob的公钥。此时,Susan拥有的是Doug的公钥,但自认为是Bob的公钥。因此,Doug可以冒充Bob用自己的死要做成数字签名并写信给Susan,让Susan用假的Bob公钥进行解密。
    • 后来,Susan感觉不对劲。发现自己无法确定公钥是否真属于Bob,她要求Bob去找证书中心为Bob的公钥认证。证书中心用自己的私钥对Bob的公钥和一些相关信息进行加密,生成数字证书
    • Bob拿到数字证书以后,就可以放心了。以后再给Susan写信,只要在签名的同时,附上数字中心的证书即可。
    • Susan收到信后,用证书中心的公钥解开数字证书,就可以拿到Bob的真实公钥,因此就可以证明数字签名是否真是Bob所签。

    举例

    应用数字证书的实例—https协议。

    • 首先,服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
    • 客户端根据浏览器里的证书管理器受信任的根证书颁发机构列表,查看解开数字证书的公钥是否在列表之内。
    • 如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
    • 如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
    • 如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。

    总结

    • 发信方和接收方使用相同的Hash函数1
    • 发信方使用接收方的公钥对信息加密,接收方用自己的私钥解密。

    密码原理

    1. 密码算法本身不能作为安全解决方案,而是构建解决方案的模块。密钥是输入到密码算法中的秘密参数。
    2. 加密以某种方式将消息变换成对任何不知道如何做逆变换的人都不可理解的人。
    3. 加密函数及相应的解密函数所表示的变换被称为密码
    4. 只有密钥应该保密。给定明文消息的密文依赖于加密算法和密钥。加密算法公开,用密钥加密码算法参数化。

    对加密算法的要求

    1. 它能用一种方法把明文转化成密文,使只有指定的接收者(持有解密秘钥的人)才能被密文恢复成明文。
    2. 最好的密码算法可以防止攻击者在知道明文和密文的情况下推测出密钥。

    密码分类


    对称密钥密码

    1. 单钥加密的情况下,密钥只有一把,所以密钥的保存变得很重要。一旦密钥泄漏,密码也就被破解(一对一)。
    2. 通用的单钥加密算法为DES(Data Encryption Standard)。3DES 通过增加密钥长度来有效 抵抗对DES的密码分析。该种方法实现较慢,IBM设计之初考虑用硬件实现。正在被AES(Advanced Encryption Standard)取代,该算法实现较快,不需太多内存,适用于小型移动设备。

    公钥密码

    双钥加密的原理如下:

    a)公钥和私钥是一一对应的关系,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立。
    b)所有的(公钥,私钥)对都是不同的。
    c)用公钥可以解开私钥加密的信息,反之亦成立。
    d)同时生成公钥和私钥应该相对比较容易,但是从公钥推算出私钥,应该是很困难或者是不可能的
    1. 任何人都可以通过公钥为私钥拥有者加密消息(多对一)。
    2. 私钥密钥与加密算法加密消息,通过公钥解密消息。这个性质可以用作认证,该种消息只能由私钥拥有者发出。
    3. 公钥用来加密信息,私钥用来数字签名。
    4. 通用的双钥加密算法为RSA( Rivest-Shamir -Adleman ) ,依赖于 大数因子分解极大的计 算开销。

    认证码

     背景:加密算法本身不能提供数据的完整性,认证码用于包含在被传输的消息中,验证消息的真实性和数据的完整性。认证码类似于校验和、循环冗余码,为了支持认证,认证码包含一些证据来证明创建该认证码的人知道一个只有所声称的消息的发送方才知道的秘密。如:证据是密钥加密的值,而秘密可能是密钥。

    1. 原始消息不需要保密

      • 有一类认证码将加密与密码散列函数结合,密码散列函数是输出消息的足够冗余位来发现任何篡改,它输出的值被称为消息摘要,就像传统校验和一样被追加在消息后。不管原始消息有多长,一个给定的散列函数产生的所有消息摘要都具有相同的位数。因为所有可能的输入消息空间比可能的消息摘要空间大,就会出现不同的输入消息产生相同的消息摘要情况,就像散列表中的碰撞。
      • 密码散列算法公开,就像密码算法一样。
    2. 加密消息摘要

      • 通过加密消息摘要创建认证码,接收方计算消息明文部分的摘要,并于解密后的消息摘要对比。如果二者相等,那么接收方可以断定该消息的确来自所声称的发送方并且没被修改。(Hash->加密->解密->Hash)
      • 攻击者能监听到原始的明文消息以及被加密的摘要。然后攻击者利用公开的散列函数计算原始消息的摘要,并产生替换消息,从中寻找具有相同摘要的消息。如果找到这样一条消息,攻击者就能将新消息与旧认证码一起发送,而不被检测。因此,为了保证安全性,要求散列函数具有单向性,即攻击者找到具有与原始消息相同摘要的明文消息在计算上是不可行的
      • 散列函数:对于能够满足要求的散列函数,其输出必须均匀地随机分布。如果输出不是随机分布的,即某些输出比其他输出更有可能,则更容易找到具有相同摘要的另一消息,这会降低算法的安全性。
      • 常用密码散列算法:消息摘要(MD5)和安全散列函数1(SHA-1),MD5输出128位摘要,SHA-1输出160为摘要。这两种算法都被攻击者利用来寻找碰撞。鼓励使用由SHA的四个变形组成的SHA-2。
      • 数字签名:通过公钥算法用私钥加密的摘要被称为数字签名 2。 数字签名标准 DSS 使用三种公钥密码,一基于RSA,一基于ELGamal,一基于椭圆曲线数字签名算法。

    总结

    实际应用中,保密性用对称密码要密码实现,它比公钥密码快得多。并且将认证码包含在加密过程中的开销很小,认证码增强了安全性。


    1. 参看认证码.
    2. 参看数字签名.
  • 相关阅读:
    【多线程】-实现多线程的三种方法
    在java项目启动时就执行某操作
    PHP上传多个Excel表格里的数据到数据库然后在页面显示
    PHP如何生成word并下载
    PHP把网页表单导出到word
    把PHP网页表单导出到word文档中
    HTTP Keep-Alive的作用
    利用paramiko获取上传下载远程服务器的资源信息
    3.django连接mysql数据库及安装mysqldb驱动报错解决办法
    3.Pycharm和navicate的使用
  • 原文地址:https://www.cnblogs.com/francfu/p/3462656.html
Copyright © 2011-2022 走看看