加密与安全
文章平均质量分 74
weixin_46722612
这个作者很懒,什么都没留下…
展开
-
加密与安全——数字证书
我们知道,摘要算法用来确保数据没有被篡改,非对称加密算法可以对数据进行加解密,签名算法可以确保数据完整性和抗否认性,把这些算法集合到一起,并搞一套完善的标准,这就是数字证书。因此,数字证书就是集合了多种密码学算法,用于实现数据加解密、身份认证、签名等多种功能的一种安全标准。数字证书可以防止中间人攻击,因为它采用链式签名认证,即通过根证书(Root CA)去签名下一级证书,这样层层签名,直到最终的用户证书。而Root CA证书内置于操作系统中,所以,任何经过CA认证的数字证书都可以对其本身进行校验,确保证原创 2021-03-16 23:49:21 · 483 阅读 · 0 评论 -
加密与安全——签名算法
我们使用非对称加密算法的时候,对于一个公钥-私钥对,通常是用公钥加密,私钥解密。如果使用私钥加密,公钥解密是否可行呢?实际上是完全可行的。不过我们再仔细想一想,私钥是保密的,而公钥是公开的,用私钥加密,那相当于所有人都可以用公钥解密。这个加密有什么意义?这个加密的意义在于,如果小明用自己的私钥加密了一条消息,比如小明喜欢小红,然后他公开了加密消息,由于任何人都可以用小明的公钥解密,从而使得任何人都可以确认小明喜欢小红这条消息肯定是小明发出的,其他人不能伪造这个消息,小明也不能抵赖这条消息不是自己写的。原创 2021-03-16 23:30:50 · 186 阅读 · 0 评论 -
加密与安全——非对称加密算法
从DH算法我们可以看到,公钥-私钥组成的密钥对是非常有用的加密方式,因为公钥是可以公开的,而私钥是完全保密的,由此奠定了非对称加密的基础。非对称加密就是加密和解密使用的不是相同的密钥:只有同一个公钥-私钥对才能正常加解密。因此,如果小明要加密一个文件发送给小红,他应该首先向小红索取她的公钥,然后,他用小红的公钥加密,把加密文件发送给小红,此文件只能由小红的私钥解开,因为小红的私钥在她自己手里,所以,除了小红,没有任何人能解开此文件。非对称加密的典型算法就是RSA算法,它是由Ron Rivest,Adi原创 2021-03-16 21:38:58 · 585 阅读 · 0 评论 -
加密与安全——密钥交换算法
对称加密算法解决了数据加密的问题。我们以AES加密为例,在现实世界中,小明要向路人甲发送一个加密文件,他可以先生成一个AES密钥,对文件进行加密,然后把加密文件发送给对方。因为对方要解密,就必须需要小明生成的密钥。现在问题来了:如何传递密钥?在不安全的信道上传递加密文件是没有问题的,因为黑客拿到加密文件没有用。但是,如何如何在不安全的信道上安全地传输密钥?要解决这个问题,密钥交换算法即DH算法:Diffie-Hellman算法应运而生。DH算法解决了密钥在双方不直接传递密钥的情况下完成密钥交换,这个原创 2021-03-16 21:23:17 · 443 阅读 · 0 评论 -
加密与安全——口令加密算法
上一节我们讲的AES加密,细心的童鞋可能会发现,密钥长度是固定的128/192/256位,而不是我们用WinZip/WinRAR那样,随便输入几位都可以。这是因为对称加密算法决定了口令必须是固定长度,然后对明文进行分块加密。又因为安全需求,口令长度往往都是128位以上,即至少16个字符。但是我们平时使用的加密软件,输入6位、8位都可以,难道加密方式不一样?实际上用户输入的口令并不能直接作为AES的密钥进行加密(除非长度恰好是128/192/256位),并且用户输入的口令一般都有规律,安全性远远不如安全原创 2021-03-16 20:46:04 · 2271 阅读 · 1 评论 -
加密与安全——对称加密算法
对称加密算法就是传统的用一个密码进行加密和解密。例如,我们常用的WinZIP和WinRAR对压缩包的加密和解密,就是使用对称加密算法:从程序的角度看,所谓加密,就是这样一个函数,它接收密码和明文,然后输出密文:secret = encrypt(key, message);而解密则相反,它接收密码和密文,然后输出明文:plain = decrypt(key, secret);在软件开发中,常用的对称加密算法有:密钥长度直接决定加密强度,而工作模式和填充模式可以看成是对称加密算法的参数和格式原创 2021-03-16 20:22:43 · 768 阅读 · 0 评论 -
加密与安全——Hmac算法
在前面讲到哈希算法时,我们说,存储用户的哈希口令时,要加盐存储,目的就在于抵御彩虹表攻击。我们回顾一下哈希算法:digest = hash(input)正是因为相同的输入会产生相同的输出,我们加盐的目的就在于,使得输入有所变化:digest = hash(salt + input)这个salt可以看作是一个额外的“认证码”,同样的输入,不同的认证码,会产生不同的输出。因此,要验证输出的哈希,必须同时提供“认证码”。Hmac算法就是一种基于密钥的消息认证码算法,它的全称是Hash-based原创 2021-03-16 19:16:47 · 1797 阅读 · 0 评论 -
加密与安全——BouncyCastle
我们知道,Java标准库提供了一系列常用的哈希算法。但如果我们要用的某种算法,Java标准库没有提供怎么办?方法一:自己写一个,难度很大;方法二:找一个现成的第三方库,直接使用。BouncyCastle就是一个提供了很多哈希算法和加密算法的第三方库。它提供了Java标准库没有的一些算法,例如,RipeMD160哈希算法。我们来看一下如何使用BouncyCastle这个第三方提供的算法。首先,我们必须把BouncyCastle提供的jar包放到classpath中。这个jar包就是bcprov-j原创 2021-03-16 19:16:29 · 155 阅读 · 0 评论 -
加密与安全——哈希算法
哈希算法(Hash)又称摘要算法(Digest),它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。哈希算法最重要的特点就是:相同的输入一定得到相同的输出;不同的输入大概率得到不同的输出。哈希算法的目的就是为了验证原始数据是否被篡改。Java字符串的hashCode()就是一个哈希算法,它的输入是任意字符串,输出是固定的4字节int整数:...原创 2021-03-15 22:44:35 · 2022 阅读 · 1 评论 -
加密与安全——编码算法
要学习编码算法,我们先来看一看什么是编码。ASCII码就是一种编码,字母A的编码是十六进制的0x41,字母B是0x42,以此类推:因为ASCII编码最多只能有127个字符,要想对更多的文字进行编码,就需要用Unicode。而中文的中使用Unicode编码就是0x4e2d,使用UTF-8则需要3个字节编码:因此,最简单的编码是直接给每个字符指定一个若干字节表示的整数,复杂一点的编码就需要根据一个已有的编码推算出来。比如UTF-8编码,它是一种不定长编码,但可以从给定字符的Unicode编码推算出来原创 2021-03-15 20:54:12 · 144 阅读 · 0 评论