宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

对称密钥/非对称密钥/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 AuthorityCA)

上例中,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,一个系统线程的“时机”原理是这样的:
假设有个线程快速把一个计数增加,而且他们提供一个方法获取计数,那么每次获取到的计数的奇偶性是随机的。