zoukankan      html  css  js  c++  java
  • 安全领域的一些概念

    对称密钥/非对称密钥/key/cipher

    symmetric cipher对称密钥:使用相同的密钥进行加密和解密,速度很快


    Asymmetric Cipher:非对称密钥:使用公钥加密,私钥解密,速度很慢

         key和cipher的区别:可以把cipher看成一台机器,它需要插入一个key才可以工作,可以从一端A插入明文,另一端B输出密文,或者从B插入密文,从A输出明文。
          实际上cipher是一个数学函数,key就是自变量,密文是因变量。

    数据的完整性

    M上传了一个文件及文件的digest,别人下载后可以计算文件生成的digest进行比较看是否被修改。ok了吗?非也,S可能上传自己的文件及新的digest进行覆盖,或者遇到man-in-the-middle(中间人攻击)在M上传的时候就替换了。
    1,这时,Message Authentication Code(信息验证码),MAC,是一个关联了特定key的消息摘要,只有用于相同key的人才可以从相同的数据里面生成相同的digest。
    2,也可以使用非对称密钥,A用私钥把消息摘要加密,B用A的公钥把A的加密的消息摘要解密,然后再校验完整性。
       加密的消息摘要叫签名(The encrypted message digest is called a signature)

    认证:Authentication

       确保和你打交道的人确实是他声称的那个人。
       非对称密钥可以用来认证,像上面的2,描述那样。
       非对称密钥在计算上是很昂贵的,通常用来认证会话的参与者,而整个会话的内容使用对称密钥进行加密。常见场景是:SSH/SSL。


    证明(保证、证书)Certificate:信任链的建立

    H有M和W的公钥,H信任M,M信任W,H不信任W,H与W之间建立信任链:
       如果M知道W的公钥,她可以帮助H,证明:由某人发布的一个关于“谁谁谁的公钥是某某某”的声明,证明是被公钥签名的。M创建证书,把自己和W的信息以及W的公钥放到文件里面,用自己的私钥进行签名,然后H可以下载证书并用M的公钥验证签名,如果通过验证,H就信任W了,即信任他的公钥了。

    证书链:

    证书A可被证书B验证,证书B可以被C验证....称为证书链。
    证书链不可能无限那么从哪里开始呢?证书链从一个 self-signed 即issuer and subject相同的证书开始,称为Certificate Authority(CA)


    上例中,M充当了CA的角色。
    R需要验证被J签名的证书,J提供R一个证书链:
    第一个证书包含J的公钥,由F发行,第二个证书包含F的公钥,由M(CA)发行,
    证书链的工作过程:
    R首先用M的公钥验证F的证书,ok了再用F的公钥验证J的证书,如果ok就信任J的公钥了,从而可以相信J是他自己了。

    凭什么要信任CA?
       当你可以验证这个CA时,你可以信任它。如何验证?
       方法1,计算CA证书的信息熵(fingerprint),然后联系CA的发布者,看看他们的digest是否一致;
       方法2,CA发布者把CA的信息熵(fingerprint)广泛公布,如果你发现CA的digest和公布的一致就可信任。

    很多CA都内嵌到了浏览器里面,那你怎么相信浏览器里面的CA没被攻击篡改呢?不知道,那就只有https下载了。

    java 安全

    JCA Java Cryptography Architecture,包名:java.security.*,javax.crypto.*
    JCE extension for JCA :只在美国和加拿大发布的,javax.crypto.*
       访问控制、安全策略、的一些类也在java.security.* 里面,与JCA并无直接联系。

    随机数:

    java安全领域很关键的一点是随机数。

    java.util.Random默认使用系统时钟作为种子,只要知道种子,生成的数是可以预测的。 用来作为密钥生成不可以。

    java.security.SecureRandom使用一个信息摘要(digest)作为种子,而且每次都会更新这个digest,所以很难预测,


    如果应用程序有随机数来源(比如用户连续键盘输入时间间隔的低阶位是随机的,Keystroke Timing),可以通过setSeed()方法设置。

    默认的SecurityRandom使用self-seed,即Thread-Timing,一个系统线程的“时机”原理是这样的:
    假设有个线程快速把一个计数增加,而且他们提供一个方法获取计数,那么每次获取到的计数的奇偶性是随机的。

  • 相关阅读:
    家庭记账本开发进度6
    家庭记账本开发进度5
    家庭记账本开发进度4
    家庭记账本开发笔记3
    大道至简阅读笔记01
    个人作业 数组(续)
    二维数组
    个人作业1-数组
    软件工程第一周开课微博
    第一周学习进度条报告
  • 原文地址:https://www.cnblogs.com/cwjcsu/p/8433080.html
Copyright © 2011-2022 走看看