草庐IT

对称加密与非对称加密-混合加密

dashingqi 2023-03-28 原文
Android_Banner.jpg

我们知道 HTTPS的安全性是由TLS保证的;

并且通信过程中具备【机密性】、【完整心】、【身份认证】、【不可否认】这四个特性就是安全的;

要搞定机密性的手段就是【加密】

今天我们说的对称加密与非对称加密就是描述【机密性】这一特性;

几个概念

加密的手段就是把消息通过某种方式换成谁也看不懂的信息,只有通过固定的钥匙才能解密出原始的消息;

明文

加密前的消息叫做明文

密文

加密后的消息称为密文

解密

通过密钥解出原始的消息叫做解密

加密算法

加密解密的操作过程称为加密算法

密钥

固定的钥匙就是密钥;

密钥是一长串的数字,单位时【位(bit)】;

按照密钥的使用方式,加密可以分为【对称加密】和【非对称加密】

对称加密

所谓的对称加密就是加密和解密过程所需要的密钥是同一个;

只要保证了密钥的安全性就是保证了通信过程中具有机密性了;

TLS中常用的对称加密算法
AES

AES目前非常流行,应用最广泛的对称加密,是【高级加密标准】,密钥长度可以是 128、192、256;

安全强度高、性能好;有些硬件也做过对其的特殊优化;

ChaCha20

是Google设计的,密钥固定长度为256位;在软件上运行的性能要超过AES,曾在客户端上比较流行;

后来ARMV8之后也加入了AES的硬件优化,现在优势和AES比不是很大了;

对称加密的分组模式

所谓的分组模式就是让算法用固定长度的密钥加密任意长度的明文;

最新的分组模式称为AEAD。加密的同时增加了认证的功能;常用有【GCM】、【CCM】和【Poly1305】

Example
  • AES128-GCM:密钥长度为128为的AES算法,使用的分组模式是GCM
  • ChaCha20-Poly1305:使用ChaCha20算法,分组模式Poly1305;

非对称加密

对称加密有一个很大的问题,就是如何把密钥安全的传给对方呢?因为第一次从机密性角度来说,密钥的交换就是裸着呢;也容易出现鸡生蛋、蛋生鸡的问题;

这时候非对称加密就派上用场了,非对称加密也称为公钥加密算法

两个密钥

非对称加密中有两个密钥,【公钥】、【私钥】;

这两个密钥是不同的,不对称的;

公钥

公钥是公开给任何人使用的;

公钥加密的数据只能由私钥能解

密钥

密钥是保密的;

私钥加密的数据只能由共钥能解;

解决问题

非对称加密能解决密钥传递的问题,我们访问的网站私钥是秘密保管的,对外公开公钥;这样就算消息被黑客截取到了,那么没有私钥也解不出消息报文;

TLS中的非对称算法

DH、DSA、RSA、ECC

RSA是TLS中非对称加密的扛把子,本身非对称算法就比对称算法要复杂,RSA安全性是基于【整数分解】;随着计算机算力的提高,RSA的长度也由1024增长到至少2048位;

ECC属于非对称加密的后起之秀,反正挺厉害的,都和数学和密码学相关的;

混合加密

综合上述所讲,是不是就可以认为使用非对称加密替代加密算法了呢?

肯定不是,因为非对称加密都是基础复杂的数学难题,运行速度上很慢,性能不是很给力;

仅仅使用非对称加密虽然解决了安全,但是速度不行;

描述

其实对称加密的问题就是出现在首次密钥交换的工程是不安全,我们可以使用非对称加密在首次通信时讲对称的密钥进行传递,之后真正进行消息传递时使用对称加密,这个混合加密即解决了首次密钥安全的问题也解决了通信过程加解密的性能问题;

混合加密示意图
HTTP-混合加密.png

有关对称加密与非对称加密-混合加密的更多相关文章

  1. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  2. ruby - 使用 AES 的 Rails 加密,过于复杂 - 2

    我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25

  3. ruby - 如何测试正在使用 RSpec 和 Mocha 调用的混合类方法? - 2

    我有一个模块:moduleMyModuledefdo_something#...endend由类使用如下:classMyCommandextendMyModuledefself.execute#...do_somethingendend如何验证MyCommand.execute调用了do_something?我已经尝试使用mocha进行部分模拟,但是当未调用do_something时它不会失败:it"callsdo_something"doMyCommand.stubs(:do_something)MyCommand.executeend 最佳答案

  4. ruby-on-rails - 为什么 DataMapper 使用混合与继承? - 2

    所以我只是对此感到好奇:DataMapper为其模型使用混合classPostincludeDataMapper::Resource虽然active-record使用继承classPost有谁知道为什么DataMapper选择这样做(或者为什么AR选择不这样做)? 最佳答案 它允许您从另一个不是DM类的类继承。它还允许动态地将DM功能添加到类中。这是我正在处理的模块中的类方法:defdatamapper_classklass=self.dupklass.send(:include,DataMapper::Resource)klass

  5. ruby - 如何使用私钥加密完全加密 Ruby 中的数据? - 2

    首先,关于我们系统的一些信息,它基本上是建筑行业的电子招标解决方案。所以:列表项我们的系统有多家公司每个公司都有多个用户每家公司可以创建多个拍卖然后其他公司可以为可用的拍卖提交他们的出价。一个出价包含数百或数千个单独的项目,我们只需要加密这些记录的“价格”部分。我们面临的问题是,我们的大客户不希望我们知道投标价格,至少在投标过程中是这样,这是完全可以理解的。现在,我们只是通过对称加密对价格进行加密,因此即使价格在数据库中有效加密,他们担心的是我们拥有解密价格的key。因此,我们正在研究某种形式的公钥加密系统。以下是我们对解决方案的初步想法:当一家公司注册时,我们会使用OpenSSL为其

  6. ruby-on-rails - 我如何比较 'Bcrypt' Gem解密的密码和加密的密码 - 2

    我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,

  7. ruby-on-rails - 将 Ruby 代码和文字标记与 Haml 混合 - 2

    如何用HAML编写这个ERB:#OR我可以:=some_ruby_code+":"#and=some_ruby_code%br但我不想在这里连接,我想将它写成内联:(=some_ruby_code):#and(=some_ruby_code)%br 最佳答案 =some_ruby_code+":"-#and=some_ruby_code+""编辑1:我不确定您在寻找什么。你想要其中之一吗?==#{some_ruby_code}:-#and==#{some_ruby_code}或==#{some_ruby_code}:-#and=so

  8. ruby - 如何在Elixir中使用AES CBC 128进行加密和解密 - 2

    我在Rails中有一个具有以下方法的应用程序,该方法可以加密和解密文本并与Java客户端通信。defencrypt(string,key)cipher=OpenSSL::Cipher::AES.new(128,:CBC)cipher.encryptcipher.padding=1cipher.key=hex_to_bin(Digest::SHA1.hexdigest(key)[0..32])cipher_text=cipher.update(string)cipher_textexcenddefhex_to_bin(str)[str].pack"H*"enddefbin_to_hex(

  9. ruby-on-rails - 如何生成用于 attr_encrypted 的加密 key - 2

    我正在考虑使用attr_encrypted在Rails应用程序中用于字段级加密的gem。如何生成用于此gem的加密key?更新:Encryptor的文档,它是attr_encrypted使用的底层加密,声明如下(在Usage|Basic下):secret_key=Digest::SHA256.hexdigest('asecretkey')encrypted_value=Encryptor.encrypt('somestringtoencrypt',:key=>secret_key)我猜想key可以是任意长度的随机字符串,而对hexdigest的调用将从中计算出适当的固定长度字符串。这是

  10. ruby - 在Ruby中访问pgp加密文件 - 2

    我有一个pgp加密文件,我需要在运行时从中提取数据。这可以通过仅解密到内存来完成吗(而不是创建解密文件并在完成后将其删除)? 最佳答案 名为OpenPGP的Ruby库几个月前发布。看起来它对你有用。 关于ruby-在Ruby中访问pgp加密文件,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1083546/

随机推荐