《Java核心技术 卷II》笔记——(12)安全&加密

JAVA用户认证?

Java的认证部分主要负责确定程序使用者的身份。而授权则是将各个用户映射到相应的权限。例如,我们登陆的时候会进行用户名密码的校验这个过程可以理解为认证的过程。当校验通过之后,将会根据事先配置好的数据(数据库中存储的或者配置文件中配置的等)进行权限的分配,这个过程可以理解为授权。

认证的步骤:

  1. 应用初始化一个LoginContext。
  2. LoginContext咨询一个login配置,并加载指定入口配置的所有LoginModules。
  3. 应用调用LoginContext的login方法。
  4. LoginContext的login方法触发所有加载的LoginModules的login方法,每一个LoginModule尝试认证该用户,如果认证成功就将一个相关的身份和凭证关联到该Subject上。
  5. LoginContext将认证状态返回给应用。
  6. 如果认证成功,应用可以通过LoginContext获得用户(Subject)信息。

为了让JAASJava Authentication and Authorization Service)授权生效,提供不仅基于代码来源,还基于谁在运行它的访问控制许可,需要以下几步:

  1. 用户必须已经被认证
  2. 认证后的用户信息(Subject)必须与安全控制上下文关联起来,通过Subject.runAs和Subject.runAsPrivileged
  3. 必须配置基于用户身份的安全规则

相关的类?
Principal: 特征,特征描述了主体的某些属性,比如用户名、组ID或角色等。
Subject: 登录的主体,在登录时要进行认证,主体可以拥有多个特征。

加密?

加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容

大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些资料将加密直接分为对称加密和非对称加密)。

双向加密大体意思就是明文加密后形成密文,可以通过算法还原成明文。而单向加密只是对信息进行了摘要计算,不能通过算法生成明文,单向加密从严格意思上说不能算是加密的一种,应该算是摘要算法(Message Digest)吧。

消息摘要(Message Digest)?

消息摘要(Message Digest)又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。HASH函数的抗冲突性使得如果一段明文稍有变化,哪怕只更改该段落的一个字母,通过哈希算法作用后都将产生不同的值。而HASH算法的单向性使得要找到哈希值相同的两个不同的输入消息,在计算上是不可能的。所以数据的哈希值,即消息摘要,可以检验数据的完整性。(算法:MD5和SHA

用大白话来说,任何一段数据应该都和人一样是唯一的,唯一的标识是什么,人类的话目前就是指纹,而数据的指纹是什么呢?没错,就是消息摘要算法产生的这一段String。比如我们在注册网站的时候,客户端向服务器传输的,应该是我们输入的密码进行消息摘要处理后的内容,这样就算服务器被攻破,Hack也无法知道用户真实的密码是什么。

对称加密?

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。而因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。当然,安全性较低带来的优点就是优计算量小、加密速度快、加密效率高。(然并卵,现代计算机对这种级别的计算量早就不care了,安全才是最重要的。)

非对称加密?

非对称加密算法需要两个密钥来进行加密和解密,分别是公钥和私钥。需要注意的一点,这个公钥和私钥必须是一对的,如果用公钥对数据进行加密,那么只有使用对应的私钥才能解密,反之亦然。由于加密和解密使用的是两个不同的密钥,因此,这种算法叫做非对称加密算法。

对称加密与非对称加密的区别

  • 对称加密称为密钥加密,速度快,但加密和解密的钥匙必须相同,只有通信双方才能知道密钥。
  • 非对称加密称为公钥加密,算法更加复杂,速度慢,加密和解密钥匙不相同,任何人都可以知道公钥,只有一个人持有私钥可以解密。

数字签名证书?

非对称加密已经灰常安全了,但是还有一个破绽——

服务器A公布了自己的公钥,我的电脑是用服务器A的公钥加密数据后再发给服务器A的;这时候服务器B侵入了我的电脑,把我用来加密的公钥换成了它的公钥,于是我发出去的数据就会被服务器B的私钥破解了。

肿么防止公钥被篡改呢?

对,我们想到了前面的消息摘要,服务器A把公钥丢给我的时候,同时去CA申请一份数字证书,其实主要就是公钥的消息摘要,有了这份证书,当我再用公钥加密的时候,我就可以先验证一下当前的公钥是否确定是服务器A发送给我的(确认公钥的创建者)

*****(From: 总结Java常用到的六个加密技术和代码_贵公子的博客-CSDN博客_java常用加密技术 例子)

关于数字签名和非对称加密算法的使用,还看到一个非常棒的例子,分享给大家:

唉,这个月买了太多的书,到月底揭不开锅了。正巧在QQ上遇到了Clark:
1-2-3:“Clark,我需要200两纹银,能否借给我?”
Clark:“没问题。我这就给你转账。请给我一张借条。”
1-2-3:“太谢谢了,我这就用Word写一个借条给你。”

然后,我新建一个Word文档,写好借条,存盘。然后,然后怎么办呢?我不能直接把借条发送给Clark,原因有:
1. 我无法保证Clark不会在收到借条后将“纹银200两”改为“纹银2000两”。(可能篡改内容)
2. 如果我赖账,Clark无法证明这个借条就是我写的。(确定创建者)
3. 普通的Word文档不能作为打官司的证据。

好在我早就申请了数字证书。我先用我的私钥对借条进行加密,然后将加密后的密文用QQ发送给Clark。Clark收到了借条的密文后,在数字证书认证中心的网站上下载我的****公钥,然后使用我的公钥将密文解密,发现确实写的是“借纹银200两”,Clark就可以把银子放心的借给我了,我也不会担心Clark会篡改我的借条,原因是:

  1. 由于我发给Clark的是密文,Clark无法进行修改。Clark倒是可以修改<u>解密后</u>的借条,但是Clark没有我的私钥,没法模仿我对借条进行加密。这就叫防篡改
  2. 由于用我的私钥进行加密的借条,有且只有我的公钥可以解密。反过来讲,能用我的公钥解密的借条,一定是使用我的私钥加密的,而只有我才拥有我的私钥,这样Clark就可以证明这个借条就是我写的。这就叫防抵赖
  3. 如果我一直赖着不还钱,Clark把我告上了法庭,这个用我的私钥加密过的Word文档就可以当作程堂证供。因为我国已经出台了《中华人民共和国电子签名法》,使数字签名具有了法律效力。

你一定已经注意到了,这个使用我的私钥进行了加密的借条,具有了防篡改、防抵赖的特性,并且可以作为程堂证供,就跟我对这个借条进行了“签名”的效果是一样的。对了,“使用我的私钥对借条进行加密”的过程就叫做数字签名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值