• 关于 文摘要 的搜索结果

回答

几种对称性加密算法:AES,DES,3DES DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密,而3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高。相较于DES和3DES算法而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准。 几种非对称性加密算法:RSA,DSA,ECC RSA和DSA的安全性及其它各方面性能都差不多,而ECC较之则有着很多的性能优越,包括处理速度,带宽要求,存储空间等等。 几种线性散列算法(签名算法):MD5,SHA1,HMAC 这几种算法只生成一串不可逆的密文,经常用其效验数据传输过程中是否经过修改,因为相同的生成算法对于同一明文只会生成唯一的密文,若相同算法生成的密文不同,则证明传输数据进行过了修改。通常在数据传说过程前,使用MD5和SHA1算法均需要发送和接收数据双方在数据传送之前就知道密匙生成算法,而HMAC与之不同的是需要生成一个密匙,发送方用此密匙对数据进行摘要处理(生成密文),接收方再利用此密匙对接收到的数据进行摘要处理,再判断生成的密文是否相同。 对于各种加密算法的选用: 由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。 在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。 如果在选定了加密算法后,那采用多少位的密钥呢。一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

liujae 2019-12-02 01:27:00 0 浏览量 回答数 0

回答

几种对称性加密算法:AES,DES,3DES DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密,而3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高。 相较于DES和3DES算法而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准。 几种非对称性加密算法:RSA,DSA,ECC RSA和DSA的安全性及其它各方面性能都差不多,而ECC较之则有着很多的性能优越,包括处理速度,带宽要求,存储空间等等。 几种线性散列算法(签名算法):MD5,SHA1,HMAC 这几种算法只生成一串不可逆的密文,经常用其效验数据传输过程中是否经过修改,因为相同的生成算法对于同一明文只会生成唯一的密文,若相同算法生成的密文不同,则证明传输数据进行过了修改。通常在数据传说过程前,使用MD5和SHA1算法均需要发送和接收数据双方在数据传送之前就知道密匙生成算法,而HMAC与之不同的是需要生成一个密匙,发送方用此密匙对数据进行摘要处理(生成密文),接收方再利用此密匙对接收到的数据进行摘要处理,再判断生成的密文是否相同。 对于各种加密算法的选用: 由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。 在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。 如果在选定了加密算法后,那采用多少位的密钥呢。一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

liujae 2019-12-02 01:26:58 0 浏览量 回答数 0

回答

MD5和SHA1是使用最广泛的摘要算法,但在2005年被王小云教授先后破解,所以安全性遭到怀疑。SHA-2家族包括SHA-224, SHA-256, SHA-384和SHA-512,它们生成的摘要密文分别就是224,256,384,512位,到目前为止还没有SHA-2破解的报告。虽然MD5和SHA1算法有漏洞,但也不意味着这一密码体系彻底被破解,因为破解一个密码就需要超级计算机的海量运算,而通常的安全机制中都包含多因素的防护,比如一段时间内限制密码尝试的次数等。虽然SHA-2比SHA-1具有更高的安全性,但是SHA-2应用并不广泛,原因是在某些操作系统上缺乏支持,比如WindowsXP SP2以前的版本,不过IETF已经建议2010年以后要尽量采用SHA-2。虽然.net中缺省支持SHA-2,但是实际上是调用操作系统的Win32 crypto service,摘要算法是调用CryptSignHash 函数来实现的,而因为某些OS版本不支持SHA-2,所以就不一定在所有的机器上都能运行,这个是选择SHA1还是SHA2事先要考虑的!

51干警网 2019-12-01 23:23:08 0 浏览量 回答数 0

爆款特惠

精选爆款产品低至0.95折

问题

开发者论坛一周精粹(第四十八期) ICP经营许可证办理流程

福利达人 2019-12-01 21:14:30 1649 浏览量 回答数 0

回答

aes是一种对称加密算法。应该双方都持有一个密钥。base64有标准base64实现和RFC-2045实现,两者区别在于是否会在后面加上一个rn还有一种urlbase64,专门处理http请求的参数base。你这个需要看下内部实现用的是哪一种,一般加解密错误都是算法转化环节出了错误还有你需要确认后端解密使用用的是256,cbc模式的解密?aes-256-cbcaes:加密算法256:加密摘要长度cbc:密文链接模式这些都需要跟后端进行确认

a123456678 2019-12-02 02:05:56 0 浏览量 回答数 0

回答

MD5加密也称消息摘要算法,是通过不可逆散列函数实现。用在密码上,主要为了防止数据库泄露,通过md5加密后,即使密码泄漏也无法还原原始密码。但是,目前网上有大量站点提供md5破解服务,主要利用彩虹表(大型密文-明文映射数据库),所以千万不要用自己的密码在网上加密(加密后会存储至彩虹表)。同时网站开发人员应该采用其他手段,如加盐(在原密码后加入复杂随机的数字,在进行md5)处理,能有效对抗md5破解

niccolo 2019-12-02 01:51:26 0 浏览量 回答数 0

回答

看代码了。不要太高估码农的智商了。比如如果是PHP开源软件,基本都是MD5揉来揉去,如果是.NET开源软件,基本都是DES揉来揉去。 99%的加密就是base64,md5,rc4,des3等揉来揉去,其中90%的加密是MD5散列做的,就是加一点切一点。 ######回复 @blu10ph : 你说的没错。但是,绝大部分开源软件的作者水平没这么高,尤其是业务软件,就是我说的拿几个最简单最常见的揉来揉去,加点盐,掐头去尾什么的。你以为他们懂什么椭圆双曲线加密,什么SHA3最新一代散列?######加密还分可逆和不可逆,对称不对称######老大果然是老大,”揉“用得非常之精妙。###### md5 ###### 你没有把明文贴出来,谁能猜得到? ######根据你的要求,提供了4对明文密文,呵呵######一定不是MD5###### 你这个密文长度都不固定,怎么确定呀。反正肯定不是MD5,好像也不是DES。或者有两种加密算法。因为第四段密文长度和其他不一样。 ######长度问题,你可能想复杂了######呵呵,楼主就少换了个行,你们就以为有一行长度不一致?看上去离MD5不远,至少最后一步是MD5的16位加密。######那一行长的 确实就是那么长啊###### md5 ######呵呵,说的对哦 我补充了几组明文密文组 能帮我看看算法吗?######回复 @婕仪伟琪 : 这个网站确实能通过密文反查到MD5等加密数据。我用过几次。你可以去看看.www.cmd5.com。并且从这个网站你可以看到,光摘要算法,就有十几二十种,更不用说对称,非对称算法了。而且,比如对称算法,只要明文不同,即使密钥相同,算出来的密文也完全不同。加密解密有三要素(明文,密钥,算法),才能算出密文,你只给出一串无意义的密文,神仙也推不出算法或者明文来。######MD5###### ######所以你不给出一条明文或密钥,根本不能判断是什么算法加密出来的。######在原问题上补充了4对明文密文,呵呵

kun坤 2020-06-03 14:04:23 0 浏览量 回答数 0

回答

md5算法是不可逆的,没有办法得到原文###### 引用来自“韦小仇”的评论 md5算法是不可逆的,没有办法得到原文 MD5不可逆? 没有什么是彩虹表做不到的,如果有,那就是彩虹表不全。 ######如果有salt,够咸够复杂,彩虹表暂时失效。######答案是肯定不行的!即MD5算法处理过的字符是不可逆的,因为其根本不是一种加密算法,而是一种摘要算法,楼主明白什么叫摘要吗?也就是原文的一部分,md5的意思并不是加密,而是找出代表此密码的唯一标识。打比方说123456这组密码用001来表示。23456用002来表示,而这个001是不可能反向得到123456的,因为他们没有因为所以的关系只有逻辑关联,当然md5是则是独一无二的。即123456这个密码只会生成唯一的MD5,也就是如果001是123456的MD5,那除了1233456能生成001,其它任何密码都不可能生成同样的001。这也是md5被用于密码的原因。 md5被用为密码,因为密码在存为md5后,存的不是密文,而是其摘要,也就 是你输入123456转成md5为001存到数据库里下次只有输入123456才能生成001这个md5,才会表示输入正确,如果输入的是其它值则一定生成不了md5为001的值。这是因为md5的唯一性决定的。######没法得到,不过你可以重新设置一个呀,反正有salt,利用这个得到一个新的密码,然后数据库里替换下就好了

kun坤 2020-06-08 09:43:19 0 浏览量 回答数 0

回答

" md5算法是不可逆的,没有办法得到原文######<div class=""ref""> 引用来自“韦小仇”的评论 md5算法是不可逆的,没有办法得到原文 MD5不可逆? 没有什么是彩虹表做不到的,如果有,那就是彩虹表不全。 ######如果有salt,够咸够复杂,彩虹表暂时失效。###### 答案是肯定不行的!即MD5算法处理过的字符是不可逆的,因为其根本不是一种加密算法,而是一种摘要算法,楼主明白什么叫摘要吗?也就是原文的一部分,md5的意思并不是加密,而是找出代表此密码的唯一标识。打比方说123456这组密码用001来表示。23456用002来表示,而这个001是不可能反向得到123456的,因为他们没有因为所以的关系只有逻辑关联,当然md5是则是独一无二的。即123456这个密码只会生成唯一的MD5,也就是如果001是123456的MD5,那除了1233456能生成001,其它任何密码都不可能生成同样的001。这也是md5被用于密码的原因。 md5被用为密码,因为密码在存为md5后,存的不是密文,而是其摘要,也就 是你输入123456转成md5为001存到数据库里下次只有输入123456才能生成001这个md5,才会表示输入正确,如果输入的是其它值则一定生成不了md5为001的值。这是因为md5的唯一性决定的。###### 没法得到,不过你可以重新设置一个呀,反正有salt,利用这个得到一个新的密码,然后数据库里替换下就好了"

montos 2020-06-04 14:28:14 0 浏览量 回答数 0

回答

摘要+每用户盐+全局盐 摘要即md5,sha1,sha256.. 每用户盐增加单用户暴力破解的成本,避免通过已被攻破的本站其他用户继续攻击 全局盐增加本站全用户暴力破解的成本,避免通过其他使用相同摘要方式被破解网站的信息来攻破本站  ######利用32位古文+SHA256+加密因子(也是32位古文) 基本上被破解的概率为0######有例子或这案例么?或者写个博客吧######同问.什么叫古文?之乎者也?与数字有什么差别.######有具体的方法或者案例呢?######没看明白 ,怎么样才能安全 密码!?######有好的安全的存储密码的例子吗?######用彩虹表的话加salt也是白搭。如果知道加密方式,什么加密都是白搭。######要给每个用户加不同的盐,每次改密码盐要换。这样除非给每个用户构建一个彩虹表才能反推。######salt对彩虹表是可以阻止的, 看那个Yes.######我就不明白了,干什么要破人家的密码?干吗要盗密码?吃饱了撑的!######利字当头啊######闭上眼睛,连续无规律敲击键盘100次,这个盐够强大了吧 ######SHA512 安全吗?一直用这个~~~######可以利用改良的Hash算法,这样的话如果改良方式没有泄漏,即使被拿到也不会被破解。 举例:将MD5密文映射到ASCII所有可见字符。 另外,如果用户的用户名/密码都是一对,即使再强的加密算法也是白扯,毕竟你不能保证所有其他站点的加密算法都很强大。######更多的是密码策略

kun坤 2020-06-08 11:15:38 0 浏览量 回答数 0

回答

" 摘要+每用户盐+全局盐 摘要即md5,sha1,sha256.. 每用户盐增加单用户暴力破解的成本,避免通过已被攻破的本站其他用户继续攻击 全局盐增加本站全用户暴力破解的成本,避免通过其他使用相同摘要方式被破解网站的信息来攻破本站  ###### 利用32位古文+SHA256+加密因子(也是32位古文) 基本上被破解的概率为0######有例子或这案例么?或者写个博客吧######同问.什么叫古文?之乎者也?与数字有什么差别.######有具体的方法或者案例呢?######没看明白 ,怎么样才能安全 密码!?######有好的安全的存储密码的例子吗?######用彩虹表的话加salt也是白搭。如果知道加密方式,什么加密都是白搭。######要给每个用户加不同的盐,每次改密码盐要换。这样除非给每个用户构建一个彩虹表才能反推。######salt对彩虹表是可以阻止的, 看那个Yes.######我就不明白了,干什么要破人家的密码?干吗要盗密码?吃饱了撑的!######利字当头啊######闭上眼睛,连续无规律敲击键盘100次,这个盐够强大了吧 ######SHA512 安全吗?一直用这个~~~###### 可以利用改良的Hash算法,这样的话如果改良方式没有泄漏,即使被拿到也不会被破解。 举例:将MD5密文映射到ASCII所有可见字符。 另外,如果用户的用户名/密码都是一对,即使再强的加密算法也是白扯,毕竟你不能保证所有其他站点的加密算法都很强大。######更多的是密码策略"

montos 2020-06-04 14:22:54 0 浏览量 回答数 0

问题

开发者论坛一周精粹(第五十三期)&nbsp;&nbsp;ECS如何设置404页面?

福利达人 2019-12-01 21:30:18 2626 浏览量 回答数 0

回答

说说自己知道的:1、简单加密传输 3、签名证书 4、摘要认证+随机数 5、HTTPS (使用token) 其实如果你最终要的效果是不想接口直接暴露,但是又能用restful服务的话,那可以用node做中间层,似乎目前这里的回答都不能解决直接请求暴露的问题 可以说的是 现在一般支付宝的接口都是HTTPS 然后签名证书 1.原文+token (这样防止最后提交的密文被别人拿来重复刷)服务端将token放入缓存中,服务端如果有则表示重复提交报文加密的原理参考https的原理3.几个关键的数据RSA公私钥,公钥在客户端 私钥在服务端AES key 和 nouce 用于加密hmac key 用于签名4.客户端加密步骤(1)随机生成aes key和 nouce(2)随机生成hmac key(3)用ras公钥对aeskey 进行加密然后进行base64编码 (4)用ras公钥对hmac key 进行加密然后进行base64编码 (5)nouce直接base64编码 (6)用aeskey + nouce 对原文加密 然后进行base64编码 (7)用hmac key 对 aes加密后的数据做hmac签名 最后 (3)(4)(5)(6) (7)用|拼接服务端解密 步骤相反就可以了 然后用同样的hmac 去签名 签出来的结果一致就可以了

杨冬芳 2019-12-02 02:57:48 0 浏览量 回答数 0

问题

开发者论坛一周精粹(第四十九期) 代码实现阿里云免费邮箱SMTP发邮件教程

福利达人 2019-12-01 21:17:07 2069 浏览量 回答数 0

回答

楼主的问题太大,岂是一两句话能说清的。 内容提取:是针对某个网站的爬虫还是针对所有网站的爬虫?不同的类型实现方式肯定不同。刚刚正好看到一个叫做神箭手的平台, http://www.shenjianshou.cn/,也许可以满足这步操作; 内容过滤:也可以理解为内容去噪,这个必须得自己实现了,因为没人知道你需要去掉什么内容; 摘要生成:针对英文文章,估计还有很多国外的摘要生成算法提供,至于中文的不做评论,光中文分词就是一个让人头痛的事。 其他诸如代理、转码,分类,跟爬虫其实没多大关系。

千鸟 2019-12-02 01:04:20 0 浏览量 回答数 0

回答

RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。SET(SecureElectronicTransaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。保密级别对称密钥长度(bit)RSA密钥长度(bit)ECC密钥长度(bit)保密年限808010241602010112112204822420301281283072256204019219276803842080256256153605122120这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:RonRivest,AdiShamir和LeonardAdleman。早在1973年,英国国家通信总局的数学家CliffordCocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2modn;B=A^e1modn;(公钥加密体制中,一般用公钥加密,私钥解密)e1和e2可以互换使用,即:A=B^e1modn;B=A^e2modn;

琴瑟 2019-12-02 01:26:25 0 浏览量 回答数 0

回答

密码学简介 据记载,公元前400年,古希腊人发明了置换密码。1881年世界上的第一个电话保密专利出现。在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用。 随着信息化和数字化社会的发展,人们对信息安全和保密的重要性认识不断提高,于是在1997年,美国国家标准局公布实施 了“美国数据加密标准(DES)”,民间力量开始全面介入密码学的研究和应用中,采用的加密算法有DES、RSA、SHA等。随着对加密强度需求的不断提 高,近期又出现了AES、ECC等。 使用密码学可以达到以下目的: 保密性:防止用户的标识或数据被读取。 数据完整性:防止数据被更改。 身份验证:确保数据发自特定的一方。 二. 加密算法介绍 根据密钥类型不同将现代密码技术分为两类:对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。 对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。 非对称密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。 对称加密算法 对称加密算法用来对敏感数据等信息进行加密,常用的算法包括: DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。 AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高; AES 2000年10月,NIST(美国国家标准和技术协会)宣布通过从15种侯选算法中选出的一项新的密匙加密标准。 Rijndael被选中成为将来的AES。 Rijndael是在 1999 年下半年,由研究员 Joan Daemen 和 Vincent Rijmen 创建的。AES 正日益成为加密各种形式的电子数据的实际标准。 美国标准与技术研究院 (NIST) 于 2002 年 5 月 26 日制定了新的高级加密标准 (AES) 规范。 算法原理 AES 算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。AES 使用几种不同的方法来执行排列和置换运算。 AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16 字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相 同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据 AES与3DES的比较 算法名称 算法类型 密钥长度 速度 解密时间(建设机器每秒尝试255个密钥) 资源消耗 AES 对称block密码 128、192、256位 高 1490000亿年 低 3DES 对称feistel密码 112位或168位 低 46亿年 中 非对称算法 常见的非对称加密算法如下: RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的; DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准); ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。 ECC 在1976年,由于对称加密算法已经不能满足需要,Diffie 和Hellman发表了一篇叫《密码学新动向》的文章,介绍了公匙加密的概念,由Rivet、Shamir、Adelman提出了RSA算法。 随着分解大整数方法的进步及完善、计算机速度的提高以及计算机网络的发展,为了保障数据的安全,RSA的密钥需要不断增 加,但是,密钥长度的增加导致了其加解密的速度大为降低,硬件实现也变得越来越难以忍受,这对使用RSA的应用带来了很重的负担,因此需要一种新的算法来 代替RSA。 1985年N.Koblitz和Miller提出将椭圆曲线用于密码算法,根据是有限域上的椭圆曲线上的点群中的离散对数问题ECDLP。ECDLP是比因子分解问题更难的问题,它是指数级的难度。 算法原理——椭圆曲线上的难题 椭圆曲线上离散对数问题ECDLP定义如下:给定素数p和椭圆曲线E,对Q=kP,在已知P,Q 的情况下求出小于p的正整数k。可以证明由k和P计算Q比较容易,而由Q和P计算k则比较困难。 将椭圆曲线中的加法运算与离散对数中的模乘运算相对应,将椭圆曲线中的乘法运算与离散对数中的模幂运算相对应,我们就可以建立基于椭圆曲线的对应的密码体制。 例如,对应Diffie-Hellman公钥系统,我们可以通过如下方式在椭圆曲线上予以实现:在E上选取生成元P,要 求由P产生的群元素足够多,通信双方A和B分别选取a和b,a和b 予以保密,但将aP和bP公开,A和B间通信用的密钥为abP,这是第三者无法得知 的。 对应ELGamal密码系统可以采用如下的方式在椭圆曲线上予以实现: 将明文m嵌入到E上Pm点,选一点B∈E,每一用户都选一整数a,0<a<N,N为阶数已知,a保密,aB公开。欲向A 送m,可送去下面一对数偶:[kB,Pm+k(aAB)],k是随机产生的整数。A可以从kB求得k(aAB)。通过:Pm+k(aAB)- k(aAB)=Pm恢复Pm。同样对应DSA,考虑如下等式: K=kG [其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数] 不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。 这就是椭圆曲线加密算法采用的难题。我们把点G称为基点(base point),k(k<n,n为基点G的阶)称为私有密钥(privte key),K称为公开密钥(public key)。 ECC与RSA的比较 ECC和RSA相比,在许多方面都有对绝对的优势,主要体现在以下方面: Ø 抗攻击性强。相同的密钥长度,其抗攻击性要强很多倍。 Ø 计算量小,处理速度快。ECC总的速度比RSA、DSA要快得多。 Ø 存储空间占用小。ECC的密钥尺寸和系统参数与RSA、DSA相比要小得多,意味着它所占的存贮空间要小得多。这对于加密算法在IC卡上的应用具有特别重要的意义。 Ø 带宽要求低。当对长消息进行加解密时,三类密码系统有相同的带宽要求,但应用于短消息时ECC带宽要求却低得多。带宽要求低使ECC在无线网络领域具有广泛的应用前景。 ECC的这些特点使它必将取代RSA,成为通用的公钥加密算法。比如SET协议的制定者已把它作为下一代SET协议中缺省的公钥密码算法。 下面两张表示是RSA和ECC的安全性和速度的比较: 攻破时间 (MIPS年) RSA/DSA (密钥长度) ECC 密钥长度 RSA/ECC 密钥长度比 104 512 106 5:1 108 768 132 6:1 1011 1024 160 7:1 1020 2048 210 10:1 1078 21000 600 35:1 RSA和ECC安全模长得比较 功能 Security Builder 1.2 BSAFE 3.0 163位ECC(ms) 1,023位RSA(ms) 密钥对生成 3.8 4,708.3 签名 2.1(ECNRA) 228.4 3.0(ECDSA) 认证 9.9(ECNRA) 12.7 10.7(ECDSA) Diffie—Hellman密钥交换 7.3 1,654.0 RSA和ECC速度比较 散列算法 散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结 果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为雪崩效应。散列还应该是防冲突的,即找不出具有 相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。 单向散列函数一般用于产生消息摘要,密钥加密等,常见的有: Ø MD5(Message Digest Algorithm 5):是RSA数据安全公司开发的一种单向散列算法。 Ø SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值; SHA-1 在1993年,安全散列算法(SHA)由美国国家标准和技术协会(NIST)提出,并作为联邦信息处理标准(FIPS PUB 180)公布;1995年又发布了一个修订版FIPS PUB 180-1,通常称之为SHA-1。SHA-1是基于MD4算法的,并且它的设计在很大程度上是模仿MD4的。现在已成为公认的最安全的散列算法之一,并 被广泛使用。 算法原理 SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。 单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。如果在输入序列中嵌入密码,那么任何人在不知道密码 的情况下都不能产生正确的散列值,从而保证了其安全性。SHA将输入流按照每块512位(64个字节)进行分块,并产生20个字节的被称为信息认证代码或 信息摘要的输出。 该算法输入报文的最大长度不超过264位,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。 通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的 明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表 示明文未被改动,如果不一致表示明文已被篡改。 MAC (信息认证代码)就是一个散列结果,其中部分输入信息是密码,只有知道这个密码的参与者才能再次计算和验证MAC码的合法性。MAC的产生参见下图。 输入信息 密码 散列函数 信息认证代码 SHA-1与MD5的比较 因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同: Ø 对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。 Ø 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。 Ø 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。 对称与非对称算法比较 以上综述了两种加密方法的原理,总体来说主要有下面几个方面的不同: Ø 在管理方面:公钥密码算法只需要较少的资源就可以实现目的,在密钥的分配上,两者之间相差一个指数级别(一个是n一个是n2)。所以私钥密码算法不适应广域网的使用,而且更重要的一点是它不支持数字签名。 Ø 在安全方面:由于公钥密码算法基于未解决的数学难题,在破解上几乎不可能。对于私钥密码算法,到了AES虽说从理论来说是不可能破解的,但从计算机的发展角度来看。公钥更具有优越性。 Ø 从速度上来看:AES的软件实现速度已经达到了每秒数兆或数十兆比特。是公钥的100倍,如果用硬件来实现的话这个比值将扩大到1000倍。 三. 加密算法的选择 前面的章节已经介绍了对称解密算法和非对称加密算法,有很多人疑惑:那我们在实际使用的过程中究竟该使用哪一种比较好呢。 我们应该根据自己的使用特点来确定,由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。 对称加密算法不能实现签名,因此签名只能非对称算法。 由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。 在实际的操作过程中,我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。 如果在选定了加密算法后,那采用多少位的密钥呢。一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。 四. 密码学在现代的应用 随着密码学商业应用的普及,公钥密码学受到前所未有的重视。除传统的密码应用系统外,PKI系统以公钥密码技术为主,提供加密、签名、认证、密钥管理、分配等功能。 保密通信:保密通信是密码学产生的动因。使用公私钥密码体制进行保密通信时,信息接收者只有知道对应的密钥才可以解密该信息。 数字签名:数字签名技术可以代替传统的手写签名,而且从安全的角度考虑,数字签名具有很好的防伪造功能。在政府机关、军事领域、商业领域有广泛的应用环境。 秘密共享:秘密共享技术是指将一个秘密信息利用密码技术分拆成n个称为共享因子的信息,分发给n个成员,只有 k(k≤n)个合法成员的共享因子才可以恢复该秘密信息,其中任何一个或m(m≤k)个成员合作都不知道该秘密信息。利用秘密共享技术可以控制任何需要多 个人共同控制的秘密信息、命令等。 认证功能:在公开的信道上进行敏感信息的传输,采用签名技术实现对消息的真实性、完整性进行验证,通过验证公钥证书实现对通信主体的身份验证。 密钥管理:密钥是保密系统中更为脆弱而重要的环节,公钥密码体制是解决密钥管理工作的有力工具;利用公钥密码体制进行密钥协商和产生,保密通信双方不需要事先共享秘密信息;利用公钥密码体制进行密钥分发、保护、密钥托管、密钥恢复等。 基于公钥密码体制可以实现以上通用功能以外,还可以设计实现以下的系统:安全电子商务系统、电子现金系统、电子选举系统、电子招投标系统、电子彩票系统等。 公钥密码体制的产生是密码学由传统的政府、军事等应用领域走向商用、民用的基础,同时互联网、电子商务的发展为密码学的发展开辟了更为广阔的前景。 五. 加密算法的未来 随着计算方法的改进,计算机运行速度的加快,网络的发展,越来越多的算法被破解。 在2004年国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做的破译MD5、HAVAL-128、MD4和RIPEMD算法的报告,令在场的国际顶尖密码学专家都为之震惊,意味着这些算法将从应用中淘汰。随后,SHA-1也被宣告被破解。 历史上有三次对DES有影响的攻击实验。1997年,利用当时各国 7万台计算机,历时96天破解了DES的密钥。1998年,电子边境基金会 (EFF)用25万美元制造的专用计算机,用56小时破解了DES的密钥。1999年,EFF用22小时15分完成了破解工作。因此。曾经有过卓越贡献的 DES也不能满足我们日益增长的需求了。 最近,一组研究人员成功的把一个512位的整数分解因子,宣告了RSA的破解。 我们说数据的安全是相对的,可以说在一定时期一定条件下是安全的,随着硬件和网络的发展,或者是另一个王小云的出现,目前的常用加密算法都有可能在 短时间内被破解,那时我们不得不使用更长的密钥或更加先进的算法,才能保证数据的安全,因此加密算法依然需要不断发展和完善,提供更高的加密安全强度和运 算速度。 纵观这两种算法一个从DES到3DES再到AES,一个从RSA到ECC。其发展角度无不是从密钥的简单性,成本的低廉性,管理的简易性,算法的复 杂性,保密的安全性以及计算的快速性这几个方面去考虑。因此,未来算法的发展也必定是从这几个角度出发的,而且在实际操作中往往把这两种算法结合起来,也 需将来一种集两种算法优点于一身的新型算法将会出现,到那个时候,电子商务的实现必将更加的快捷和安全。

liujae 2019-12-02 01:26:38 0 浏览量 回答数 0

回答

RSA公开密钥密码体制。所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。 保密级别 对称密钥长度(bit) RSA密钥长度(bit) ECC密钥长度(bit) 保密年限 80 80 1024 160 2010 112 112 2048 224 2030 128 128 3072 256 2040 192 192 7680 384 2080 256 256 15360 512 2120 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和 Leonard Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。RSA的算法涉及三个参数,n、e1、e2。其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。 RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)e1和e2可以互换使用,即:A=B^e1 mod n;B=A^e2 mod n;

马铭芳 2019-12-02 01:27:08 0 浏览量 回答数 0

回答

PGP协议。。。。。 电子邮件的方便、快速、费用低廉等优点,再加上它不但能传送文字信息,还可以附上图像、声音等功能,这使得电子邮件越来越受人们的欢迎。 1 电子邮件的传输过程 电子邮件通过SMTP和POP协议来进行发送和接受,但由于互联网的开放性,邮件内容是以明文的形式在互联网上进行传递。这使得人们在使用电子邮件时不得不考虑其安全因素,因此如何保证电子邮件的机密性、完整性、真实性和不可抵赖性等方面的问题显得尤为重要。 2 PGP介绍 为了使电子邮件在互联网上能够安全运行,开发出了一些安全电子邮件标准:PGP和S/MIME。其中PGP被广泛运用。 PGP(Pretty Good Privacy)是美国人Phil Zimmermann研究出来的,它是由多种加密算法(IDEA、RSA、MD5、随机数生成算法)组合而成,不但能够实现邮件的保密功能,还可以对邮件进行数字签名,使收信人能够准确判断邮件在传递过程中是否被非法篡改。 3 PGP工作原理 3.1 IDEA算法 IDEA属于对称加密算法,即加密密钥和解密密钥相同,具体的算法规则是,将输入数据以每64为一块,对每块进行分组,分为4组,每组16位,作为第一轮的输入,进行相乘、相加、异或等运行后,形成4个子分组,将中间两间进行交换,作为下一轮的输入,经过8轮运算后,同样得到4个子分组,再将这4组重新连接到一起形成密文共64位。 3.2 RSA算法 RSA属于非对称加密算法,也称公钥算法,即加密密钥和解密密钥不同,并且加密密钥可以完全公开,但由于没有解密密钥,即使非法者窃取到了密文和发送者的加密密钥也无法查看内容,解决了对称加密中对密钥管理困难的问题,RSA的安全性取决于对大数的因式分解,这是数学上的一个难题。 RSA算法描述: 1)随意选择两个大的质数p和q,p不等于q,q和p保密; 2)计算n=pq; 3)欧拉函数,φ(n) = (p-1)(q-1),n公开,φ(n)保密; 4)选择一个小于φ(n)的正整数e,满足gcd(e,φ(n))=1,e是公开的加密密钥; 5)计算d,满足de≡1(modφ(n)), d是保密的解密密钥; 6)加密变换:对明文m∈Zn,密文为C=me mod n; 7)解密变换:对密文C∈Zn,明文为m=Cd mod n; 由于RSA涉及的运算非常复杂,所以在运算速度上很慢,因而RSA算法只适合于对少量数据进行加密,如数字签名,一般情况下,如果要对大量信息进行加密,还是采用对称加密算法,因为对称加密速度比公钥加密速度快得多。 3.3 MD5算法 MD5属于Hash函数,可以将任意长度的输入压缩到固定长度的输出,具有多对一的单向特性。可以用于数字签名、完整性检测等方面。 4 PGP提供的业务 PGP提供的业务包括:认证、加密、压缩、与电子邮件兼容、基数-64变换。 4.1 认证 认证的步骤是:①发信人创建信息M;②发信人使用MD5算法产生128位的消息摘要H;③发信人用自己的私钥,采用RSA算法对H进行加密ER,M‖ER连接后进行压缩得到Z;④将Z通过互联网发送出去;⑤接收者收到信息后首先进行解压Z-1,使用发信人的公开密钥采用RSA算法进行解密得出H,用接收到的M计算消息摘要H,将得出的两个H进行比较,如果相同则接收,否则表示被篡改,拒绝。 4.2 加密 加密的步骤:发信人对信息M进行压缩,采用IDEA算法对其进行加密,用接收者的公钥对密钥进行加密,与M进行连接后发出,接收者采用RSA算法进行解密得到会话密钥,将会话密钥按IDEA算法进行解密,并解压缩,并到原文。 在加密过程中,由于信息相对内容较多,因此对信息的加密采用的是对称加密算法IDEA来实现,而密钥采用的是安全强度为高的非对称加密算法RSA实现,通过IDEA和RSA结合,不但提高了邮件传输的安全性,而且在加解密时间上也缩短了。 4.3 压缩 PGP采用ZIP算法压缩信息,这不但节省了存储空间,而且在传输过程中也节省了时间,另外,在对信息进行加密之前压缩,也相当于进行了一次变换,使其安全性增强。 4.4 与电子邮件兼容 由于电子邮件只允许使用ASCⅡ字符串,而PGP的输出却是8位串,为了与电子邮件进行兼容,PGP采用基数-64变换实现将输出的8位串转换为可以打印的ASCII字符串。 4.5 PGP消息分段和重组 电子邮件中对消息内容的长度有限制的,当大于所限制的长度时要进行分段,分段是在所有处理结束之后才进行,所以会话密钥和签名在第一个段开始位置出现。在接收端,PGP将重新组合成原来的信息。 5 PGP安全性分析 由于PGP是一种混合密码体系,它的安全性在于IDEA、RSA、MD5算法的安全性分析。 5.1 IDEA的安全性 在PGP中采用IDEA的64位CFB模式,很多研究者对IDEA的弱点进行了分析,但也没有找到破译的方法,由此可见,IDEA算法也是比较安全的,它的攻击方法只有“直接攻击”或者是“密钥穷举”攻击。(原作者:钟泽秀)5.2 RSA的安全性 RSA算法是非对称密码体制,它的安全性基于大整数的素分解的难解性,经过长期的研究至今也未找到一个有效的解决方案,在数学上就是一个难题,因此,RSA公钥密码体制就建立在对大数的因式分解这个数学难题上。 假设密码分析者能够通过n分解因子得到p和q,那么他很容易就可以求出欧拉函数φ(n)和解密密钥d,从而破译RSA,因此,破译RSA比对n进行因式分解难度更大。 假设密码分析者能够不对n进行因子分解就求出欧拉函数φ(n),那么他可以根据de≡1(modφ(n)),得到解密密钥d,从而破译RSA,因为p+q=n-φ(n)+1,p-q=sqr(p+q)^2-4n,所以知道φ(n)和n就可以容易地求得p和q,从而成功地分解n,所以不对n进行因子分解而直接计算φ(n)比对n进行因子分解难度更大。 假如密码分析者能够即不对n进行因子分解也不需要求φ(n)而是直接求得解密密钥d,那么他就可以计算ed-1,其中ed-1是欧拉函数φ(n)的倍数,因为利用φ(n)的倍数可以容易的分解出n的因子。所以,直接计算解密密钥d比对n进行因式分解更难。 虽然n越大其安全性越高,但由于涉及到复杂的数学运算,会影响到运行速度,那么我们实际运用中,如果来决定n的大小使其既安全其速度又不能太慢,目前n的长度为1024位至2048位比较合理。 研究人员建议,在运用RSA算法时,除了指定n的长度外,还应对p和q进行限制:①p和q的大小应该相差不多;②p-1和q-1都应该包含大的素因子;③gcd(p-1,q-1)应该很小。 5.3 MD5的安全性 MD5是在MD4的基础上发展起来的,在PGP中被用来单向变换用户口令和对信息签名的单向散列算法。它的安全性体现在能将任意输入长度的消息转化为固定长度的输出。目前对单向散列的直接攻击包括普通直接攻击和“生日攻击”。 在密码学中,有这么一句话:永远不要低估密码分析者的能力。这也将是密码设计者与密码分析者的较量,事实上绝对不可破译的密码体制在理论上是不存在的,因此,在实际应用中,一个密码体制在使用一段时间后,会换一些新的参数,或者是更换一种新的密码体制,当然,密钥也是要经常换的。由此可见,PGP软件虽然给我们的电子邮件带来了安全性保障,但它也不是永恒的,也许在不久的将来,由于它的弱点被攻击而被新的安全电子邮件产品所代替。

晚来风急 2019-12-02 01:26:46 0 浏览量 回答数 0

回答

HTTPS基本原理 一、http为什么不安全。 http协议没有任何的加密以及身份验证的机制,非常容易遭遇窃听、劫持、篡改,因此会造成个人隐私泄露,恶意的流量劫持等严重的安全问题。 国外很多网站都支持了全站https,国内方面目前百度已经在年初完成了搜索的全站https,其他大型的网站也在跟进中,百度最先完成全站https的最大原因就是百度作为国内最大的流量入口,劫持也必然是首当其冲的,造成的有形的和无形的损失也就越大。关于流量劫持问题,我在另一篇文章中也有提到,基本上是互联网企业的共同难题,https也是目前公认的比较好的解决方法。但是https也会带来很多性能以及访问速度上的牺牲,很多互联网公司在做大的时候都会遇到这个问题:https成本高,速度又慢,规模小的时候在涉及到登录和交易用上就够了,做大以后遇到信息泄露和劫持,想整体换,代价又很高。 2、https如何保证安全 要解决上面的问题,就要引入加密以及身份验证的机制。 这时我们引入了非对称加密的概念,我们知道非对称加密如果是公钥加密的数据私钥才能解密,所以我只要把公钥发给你,你就可以用这个公钥来加密未来我们进行数据交换的秘钥,发给我时,即使中间的人截取了信息,也无法解密,因为私钥在我这里,只有我才能解密,我拿到你的信息后用私钥解密后拿到加密数据用的对称秘钥,通过这个对称密钥来进行后续的数据加密。除此之外,非对称加密可以很好的管理秘钥,保证每次数据加密的对称密钥都是不相同的。 但是这样似乎还不够,如果中间人在收到我的给你公钥后并没有发给你,而是自己伪造了一个公钥发给你,这是你把对称密钥用这个公钥加密发回经过中间人,他可以用私钥解密并拿到对称密钥,此时他在把此对称密钥用我的公钥加密发回给我,这样中间人就拿到了对称密钥,可以解密传输的数据了。为了解决此问题,我们引入了数字证书的概念。我首先生成公私钥,将公钥提供给相关机构(CA),CA将公钥放入数字证书并将数字证书颁布给我,此时我就不是简单的把公钥给你,而是给你一个数字证书,数字证书中加入了一些数字签名的机制,保证了数字证书一定是我给你的。 所以综合以上三点: 非对称加密算法(公钥和私钥)交换秘钥 + 数字证书验证身份(验证公钥是否是伪造的) + 利用秘钥对称加密算法加密数据 = 安全 3、https协议简介 为什么是协议简介呢。因为https涉及的东西实在太多了,尤其是一些加密算法,非常的复杂,对于这些算法面的东西就不去深入研究了,这部分仅仅是梳理一下一些关于https最基本的原理,为后面分解https的连接建立以及https优化等内容打下理论基础。 3.1 对称加密算法 对称加密是指加密和解密使用相同密钥的加密算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信至关重要。 对称加密又分为两种模式:流加密和分组加密。 流加密是将消息作为位流对待,并且使用数学函数分别作用在每一个位上,使用流加密时,每加密一次,相同的明文位会转换成不同的密文位。流加密使用了密钥流生成器,它生成的位流与明文位进行异或,从而生成密文。现在常用的就是RC4,不过RC4已经不再安全,微软也建议网络尽量不要使用RC4流加密。 分组加密是将消息划分为若干位分组,这些分组随后会通过数学函数进行处理,每次一个分组。假设需要加密发生给对端的消息,并且使用的是64位的分组密码,此时如果消息长度为640位,就会被划分成10个64位的分组,每个分组都用一系列数学公式公式进行处理,最后得到10个加密文本分组。然后,将这条密文消息发送给对端。对端必须拥有相同的分组密码,以相反的顺序对10个密文分组使用前面的算法解密,最终得到明文的消息。比较常用的分组加密算法有DES、3DES、AES。其中DES是比较老的加密算法,现在已经被证明不安全。而3DES是一个过渡的加密算法,相当于在DES基础上进行三重运算来提高安全性,但其本质上还是和DES算法一致。而AES是DES算法的替代算法,是现在最安全的对称加密算法之一。分组加密算法除了算法本身外还存在很多种不同的运算方式,比如ECB、CBC、CFB、OFB、CTR等,这些不同的模式可能只针对特定功能的环境中有效,所以要了解各种不同的模式以及每种模式的用途。这个部分后面的文章中会详细讲。 对称加密算法的优、缺点: 优点:算法公开、计算量小、加密速度快、加密效率高。 缺点:(1)交易双方都使用同样钥匙,安全性得不到保证; (2)每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。 (3)能提供机密性,但是不能提供验证和不可否认性。 3.2 非对称加密算法 在非对称密钥交换算法出现以前,对称加密一个很大的问题就是不知道如何安全生成和保管密钥。非对称密钥交换过程主要就是为了解决这个问题,使得对称密钥的生成和使用更加安全。 密钥交换算法本身非常复杂,密钥交换过程涉及到随机数生成,模指数运算,空白补齐,加密,签名等操作。 常见的密钥交换算法有RSA,ECDHE,DH,DHE等算法。涉及到比较复杂的数学问题,下面就简单介绍下最经典的RSA算法。RSA:算法实现简单,诞生于1977年,历史悠久,经过了长时间的破解测试,安全性高。缺点就是需要比较大的素数也就是质数(目前常用的是2048位)来保证安全强度,很消耗CPU运算资源。RSA是目前唯一一个既能用于密钥交换又能用于证书签名的算法。我觉得RSA可以算是最经典的非对称加密算法了,虽然算法本身都是数学的东西,但是作为最经典的算法,我自己也花了点时间对算法进行了研究,后面会详细介绍。 非对称加密相比对称加密更加安全,但也存在两个明显缺点: 1,CPU计算资源消耗非常大。一次完全TLS握手,密钥交换时的非对称解密计算量占整个握手过程的90%以上。而对称加密的计算量只相当于非对称加密的0.1%,如果应用层数据也使用非对称加解密,性能开销太大,无法承受。 2,非对称加密算法对加密内容的长度有限制,不能超过公钥长度。比如现在常用的公钥长度是2048位,意味着待加密内容不能超过256个字节。 所以公钥加密(极端消耗CPU资源)目前只能用来作密钥交换或者内容签名,不适合用来做应用层传输内容的加解密。 3.3 身份认证 https协议中身份认证的部分是由数字证书来完成的,证书由公钥、证书主体、数字签名等内容组成,在客户端发起SSL请求后,服务端会将数字证书发给客户端,客户端会对证书进行验证(验证查看这张证书是否是伪造的。也就是公钥是否是伪造的),并获取用于秘钥交换的非对称密钥(获取公钥)。 数字证书有两个作用: 1,身份授权。确保浏览器访问的网站是经过CA验证的可信任的网站。 2,分发公钥。每个数字证书都包含了注册者生成的公钥(验证确保是合法的,非伪造的公钥)。在SSL握手时会通过certificate消息传输给客户端。 申请一个受信任的数字证书通常有如下流程: 1,终端实体(可以是一个终端硬件或者网站)生成公私钥和证书请求。 2,RA(证书注册及审核机构)检查实体的合法性。如果个人或者小网站,这一步不是必须的。 3,CA(证书签发机构)签发证书,发送给申请者。 4,证书更新到repository(负责数字证书及CRL内容存储和分发),终端后续从repository更新证书,查询证书状态等。 数字证书验证: 申请者拿到CA的证书并部署在网站服务器端,那浏览器发起握手接收到证书后,如何确认这个证书就是CA签发的呢。怎样避免第三方伪造这个证书。答案就是数字签名(digital signature)。数字签名是证书的防伪标签,目前使用最广泛的SHA-RSA(SHA用于哈希算法,RSA用于非对称加密算法)数字签名的制作和验证过程如下: 1,数字签名的签发。首先是使用哈希函数对待签名内容进行安全哈希,生成消息摘要,然后使用CA自己的私钥对消息摘要进行加密。 2,数字签名的校验。使用CA的公钥解密签名,然后使用相同的签名函数对待签名证书内容进行签名并和服务端数字签名里的签名内容进行比较,如果相同就认为校验成功。 需要注意的是: 1)数字签名签发和校验使用的密钥对是CA自己的公私密钥,跟证书申请者提交的公钥没有关系。 2)数字签名的签发过程跟公钥加密的过程刚好相反,即是用私钥加密,公钥解密。 3)现在大的CA都会有证书链,证书链的好处一是安全,保持根CA的私钥离线使用。第二个好处是方便部署和撤销,即如果证书出现问题,只需要撤销相应级别的证书,根证书依然安全。 4)根CA证书都是自签名,即用自己的公钥和私钥完成了签名的制作和验证。而证书链上的证书签名都是使用上一级证书的密钥对完成签名和验证的。 5)怎样获取根CA和多级CA的密钥对。它们是否可信。当然可信,因为这些厂商跟浏览器和操作系统都有合作,它们的公钥都默认装到了浏览器或者操作系统环境里。 3.4 数据完整性验证 数据传输过程中的完整性使用MAC算法来保证。为了避免网络中传输的数据被非法篡改,SSL利用基于MD5或SHA的MAC算法来保证消息的完整性。 MAC算法是在密钥参与下的数据摘要算法,能将密钥和任意长度的数据转换为固定长度的数据。发送者在密钥的参与下,利用MAC算法计算出消息的MAC值,并将其加在消息之后发送给接收者。接收者利用同样的密钥和MAC算法计算出消息的MAC值,并与接收到的MAC值比较。如果二者相同,则报文没有改变;否则,报文在传输过程中被修改,接收者将丢弃该报文。 由于MD5在实际应用中存在冲突的可能性比较大,所以尽量别采用MD5来验证内容一致性。SHA也不能使用SHA0和SHA1,中国山东大学的王小云教授在2005年就宣布破解了 SHA-1完整版算法。微软和google都已经宣布16年及17年之后不再支持sha1签名证书。MAC算法涉及到很多复杂的数学问题,这里就不多讲细节了。 专题二--【实际抓包分析】 抓包结果: fiddler: wireshark: 可以看到,百度和我们公司一样,也采用以下策略: (1)对于高版本浏览器,如果支持 https,且加解密算法在TLS1.0 以上的,都将所有 http请求重定向到 https请求 (2)对于https请求,则不变。 【以下只解读https请求】 1、TCP三次握手 可以看到,我们访问的是 http://www.baidu.com/ , 在初次建立 三次握手的时候, 用户是去 连接 8080端口的(因为公司办公网做了代理,因此,我们实际和代理机做的三次握手,公司代理机再帮我们去连接百度服务器的80端口) 2、CONNECT 建立 由于公司办公网访问非腾讯域名,会做代理,因此,在进行https访问的时候,我们的电脑需要和公司代理机做 " CONNECT " 连接(关于 " CONNECT " 连接, 可以理解为虽然后续的https请求都是公司代理机和百度服务器进行公私钥连接和对称秘钥通信,但是,有了 " CONNECT " 连接之后,可以认为我们也在直接和百度服务器进行公私钥连接和对称秘钥通信。 ) fiddler抓包结果: CONNECT之后, 后面所有的通信过程,可以看做是我们的机器和百度服务器在直接通信 3、 client hello 整个 Secure Socket Layer只包含了: TLS1.2 Record Layer内容 (1)随机数 在客户端问候中,有四个字节以Unix时间格式记录了客户端的协调世界时间(UTC)。协调世界时间是从1970年1月1日开始到当前时刻所经历的秒数。在这个例子中,0x2516b84b就是协调世界时间。在他后面有28字节的随机数( random_C ),在后面的过程中我们会用到这个随机数。 (2)SID(Session ID) 如果出于某种原因,对话中断,就需要重新握手。为了避免重新握手而造成的访问效率低下,这时候引入了session ID的概念, session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。 因为我们抓包的时候,是几个小时内第一次访问 https://www.baodu.com 首页,因此,这里并没有 Session ID. (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。 (3) 密文族(Cipher Suites): RFC2246中建议了很多中组合,一般写法是"密钥交换算法-对称加密算法-哈希算法,以“TLS_RSA_WITH_AES_256_CBC_SHA”为例: (a) TLS为协议,RSA为密钥交换的算法; (b) AES_256_CBC是对称加密算法(其中256是密钥长度,CBC是分组方式); (c) SHA是哈希的算法。 浏览器支持的加密算法一般会比较多,而服务端会根据自身的业务情况选择比较适合的加密组合发给客户端。(比如综合安全性以及速度、性能等因素) (4) Server_name扩展:( 一般浏览器也支持 SNI(Server Name Indication)) 当我们去访问一个站点时,一定是先通过DNS解析出站点对应的ip地址,通过ip地址来访问站点,由于很多时候一个ip地址是给很多的站点公用,因此如果没有server_name这个字段,server是无法给与客户端相应的数字证书的,Server_name扩展则允许服务器对浏览器的请求授予相对应的证书。 还有一个很好的功能: SNI(Server Name Indication)。这个的功能比较好,为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。一句话简述它的工作原理就是,在连接到服务器建立SSL连接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的CA证书。目前,大多数操作系统和浏览器都已经很好地支持SNI扩展,OpenSSL 0.9.8已经内置这一功能,据说新版的nginx也支持SNI。) 4、 服务器回复(包括 Server Hello, Certificate, Certificate Status) 服务器在收到client hello后,会回复三个数据包,下面分别看一下: 1)Server Hello 1、我们得到了服务器的以Unix时间格式记录的UTC和28字节的随机数 (random_S)。 2、Seesion ID,服务端对于session ID一般会有三种选择 (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) : 1)恢复的session ID:我们之前在client hello里面已经提到,如果client hello里面的session ID在服务端有缓存,服务端会尝试恢复这个session; 2)新的session ID:这里又分两种情况,第一种是client hello里面的session ID是空值,此时服务端会给客户端一个新的session ID,第二种是client hello里面的session ID此服务器并没有找到对应的缓存,此时也会回一个新的session ID给客户端; 3)NULL:服务端不希望此session被恢复,因此session ID为空。 3、我们记得在client hello里面,客户端给出了21种加密族,而在我们所提供的21个加密族中,服务端挑选了“TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256”。 (a) TLS为协议,RSA为密钥交换的算法; (b) AES_256_CBC是对称加密算法(其中256是密钥长度,CBC是分组方式); (c) SHA是哈希的算法。 这就意味着服务端会使用ECDHE-RSA算法进行密钥交换,通过AES_128_GCM对称加密算法来加密数据,利用SHA256哈希算法来确保数据完整性。这是百度综合了安全、性能、访问速度等多方面后选取的加密组合。 2)Certificate 在前面的https原理研究中,我们知道为了安全的将公钥发给客户端,服务端会把公钥放入数字证书中并发给客户端(数字证书可以自签发,但是一般为了保证安全会有一个专门的CA机构签发),所以这个报文就是数字证书,4097 bytes就是证书的长度。 我们打开这个证书,可以看到证书的具体信息,这个具体信息通过抓包报文的方式不是太直观,可以在浏览器上直接看。 (点击 chrome 浏览器 左上方的 绿色 锁型按钮) 3)Server Hello Done 我们抓的包是将 Server Hello Done 和 server key exchage 合并的包: 4)客户端验证证书真伪性 客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下: 证书链的可信性trusted certificate path,方法如前文所述; 证书是否吊销revocation,有两类方式离线CRL与在线OCSP,不同的客户端行为会不同; 有效期expiry date,证书是否在有效时间范围; 域名domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析; 5)秘钥交换 这个过程非常复杂,大概总结一下: (1)首先,其利用非对称加密实现身份认证和密钥协商,利用非对称加密,协商好加解密数据的 对称秘钥(外加CA认证,防止中间人窃取 对称秘钥) (2)然后,对称加密算法采用协商的密钥对数据加密,客户端和服务器利用 对称秘钥 进行通信; (3)最后,基于散列函数验证信息的完整性,确保通信数据不会被中间人恶意篡改。 此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数random_C和random_S与自己计算产生的Pre-master(由客户端和服务器的 pubkey生成的一串随机数),计算得到协商对称密钥; enc_key=Fuc(random_C, random_S, Pre-Master) 6)生成 session ticket 如果出于某种原因,对话中断,就需要重新握手。为了避免重新握手而造成的访问效率低下,这时候引入了session ID的概念, session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的"对话密钥",而不必重新生成一把。 因为我们抓包的时候,是几个小时内第一次访问 https://www.baodu.com 首页,因此,这里并没有 Session ID. (稍会儿我们会看到隔了半分钟,第二次抓包就有这个Session ID) session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。 后续建立新的https会话,就可以利用 session ID 或者 session Tickets , 对称秘钥可以再次使用,从而免去了 https 公私钥交换、CA认证等等过程,极大地缩短 https 会话连接时间。 7) 利用对称秘钥传输数据 【半分钟后,再次访问百度】: 有这些大的不同: 由于服务器和浏览器缓存了 Session ID 和 Session Tickets,不需要再进行 公钥证书传递,CA认证,生成 对称秘钥等过程,直接利用半分钟前的 对称秘钥 加解密数据进行会话。 1)Client Hello 2)Server Hello

玄学酱 2019-12-02 01:27:08 0 浏览量 回答数 0

回答

数字签名算法分析与Hash签名 序:这篇文章我用了近一周的时间完成,其中涉及到的RSA算法已经在上一篇《公钥密码体系》中详细的介绍过,目前数字签名中人们使用很多的还是512位与1024位的RSA算法。 摘要: 数字签字和认证机构是电子商务的核心技术。数字签名作为目前Internet中电子商务重要的技术,不断地进行改进,标准化。本文从数字签名的意义出发,详细介绍了数字签名中涉及到的内容与算法,并自行结合进行改进。 关键词:Internet 公钥加密 Hash函数 电子商务 加密 数字签名 数字签名简介 我们对加解密算法已经有了一定理解,可以进一步讨论"数字签名"(注意不要与数字认证混淆)的问题了,即如何给一个计算机文件进行签字。数字签字可以用对称算法实现,也可以用公钥算法实现。但前者除了文件签字者和文件接受者双方,还需要第三方认证,较麻烦;通过公钥加密算法的实现方法,由于用秘密密钥加密的文件,需要靠公开密钥来解密,因此这可以作为数字签名,签名者用秘密密钥加密一个签名(可以包括姓名、证件号码、短信息等信息),接收人可以用公开的、自己的公开密钥来解密,如果成功,就能确保信息来自该公开密钥的所有人。 公钥密码体制实现数字签名的基本原理很简单,假设A要发送一个电子文件给B,A、B双方只需经过下面三个步骤即可: 1. A用其私钥加密文件,这便是签字过程 2. A将加密的文件送到B 3. B用A的公钥解开A送来的文件 这样的签名方法是符合可靠性原则的。即: 签字是可以被确认的, 签字是无法被伪造的, 签字是无法重复使用的, 文件被签字以后是无法被篡改的, 签字具有无可否认性, 数字签名就是通过一个单向函数对要传送的报文进行处理得到的用以认证报文来源并核实报文是否发生变化的一个字母数字串。用这几个字符串来代替书写签名或印章,起到与书写签名或印章同样的法律效用。国际社会已开始制定相应的法律、法规,把数字签名作为执法的依据。 数字签名的实现方法 实现数字签名有很多方法,目前数字签名采用较多的是公钥加密技术,如基于RSA Data Security公司的PKCS(Public Key Cryptography Standards)、DSA(Digital Signature Algorithm)、x.509、PGP(Pretty Good Privacy)。1994年美国标准与技术协会公布了数字签名标准(DSS)而使公钥加密技术广泛应用。同时应用散列算法(Hash)也是实现数字签名的一种方法。 非对称密钥密码算法进行数字签名 算法的含义: 非对称密钥密码算法使用两个密钥:公开密钥和私有密钥,分别用于对数据的加密和解密,即如果用公开密钥对数据进行加密,只有用对应的私有密钥才能进行解密;如果用私有密钥对数据进行加密,则只有用对应的公开密钥才能解密。 使用公钥密码算法进行数字签名通用的加密标准有: RSA,DSA,Diffie-Hellman等。 签名和验证过程: 发送方(甲)首先用公开的单向函数对报文进行一次变换,得到数字签名,然后利用私有密钥对数字签名进行加密后附在报文之后一同发出。 接收方(乙)用发送方的公开密钥对数字签名进行解密交换,得到一个数字签名的明文。发送方的公钥可以由一个可信赖的技术管理机构即认证中心(CA)发布的。 ------------------------------------------------ 数字信封 这是去年十月份完成的一个练习程序: 一.原理: 用快速的对称密钥加密大量数据,然后仅仅对对称密钥作RSA加密,将对称加密后的密文和RSA加密的对称密钥发给接收方。 有效解决了: 1. PKCS#1填充方案的长度限制问题 RSA密钥长度(bit) 加密上限(byte) 1024 117 2048 245 2. RSA加密大量数据的耗时问题 二.开发: 数字信封原理简单,而且综合应用了上面提到的对称加密、非对称加密算法。对于加密算法的学习,数字信封程序是个不错的入门题材。 (1)库文件概要: clsAES.dll DESCRIPTION:AES对称算法库文件 NAMESPACE:nsAES CLASS:clsAES MEMBERS: Methods: public byte[] AESdecrypt ( System.String encryptedtext ) public byte[] AESencrypt ( System.String plaintext ) public void GenKeyIV ( ) Constructors: public clsAES ( byte[] key , byte[] IV ) public clsAES ( ) Property variables: public byte[] key public byte[] IV AESdecrypt 和AESencrypt是实现对称加密解密的方法; GenKeyIV方法生成对称密钥的密钥值和初始向量(IV:Initial Vector); 成员变量key和IV存放对称密钥的密钥值和初始向量 csRSA.dll DESCRIPTION:RSA非对称算法库文件 NAMESPACE:nsRSA CLASS:clsRSA MEMBERS: Methods: public string strEnc(System.String strToEncrypt) public string strDec(System.String strToDecrypt) public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) Constructors: public clsRSA ( ) Variable: RSACryptoServiceProvider RSA strEnc 和strDec是实现非对称加密和解密的方法,由RSA提供加密和解密的服务。 RSAEncrypt和RSADecrypt也是实现非对称加密解密的方法,必须通过RSAKeyInfo传入RSA密钥参数。 成员变量RSA保存RSA加密服务的一个实例。 clsRsaKeyMgr.dll( RSA Key Management) DESCRIPTION:RSA非对称算法密钥管理库文件 NAMESPACE:nsRsaKeyMgr CLASS:clsRsaKeyMgr MEMBERS: Methods: public void CreatePublicKeyFile(System.String ContainerName, System.String OutputFileName) public void CreatePrivateKeyFile(System.String ContainerName, System.String OutputFileName) public RSAParameters GetPublicKeyFromFile(System.String InputFileName) public RSAParameters GetPrivateKeyFromFile(System.String InputFileName) public void GenKey_SaveInContainer(System.String ContainerName) public string GetKeyFromContainer(System.String ContainerName,bool IsFullKey) public void DeleteKeyFromContainer(System.String ContainerName) Constructors: public clsRsaKeyMgr ( ) CreatePublicKeyFile和 CreatePrivateKeyFile分别从密钥容器中创建公钥和密钥并写入到指定的文件中。 GetPublicKeyFromFile和GetPrivateKeyFromFile分别从文件中获取公钥和密钥,返回RSAParameters类型的RSA参数结构体。 GenKey_SaveInContainer在指定名称的密钥容器中创建密钥。 GetKeyFromContainer从指定名称的密钥容器中获取XML格式的密钥信息。 DeleteKeyFromContainer删除指定的密钥容器。 -------------------------------------------------- 双重签名 1996年2月1日MasterCard 与Visa两大国际信用卡组织与技术合作伙伴GTE、Netscape、IBM、Terisa Systems、Verisign、Microsoft、SAIC等一批跨国公司共同开发了安全电子交易规范(Secure Electronic Transaction,简称SET)。SET是一种应用于开放网络环境下,以信用卡为基础的安全电子支付系统的协议,它给出了一套电子交易的过程规范。通过SET这一套完备的安全电子交易协议可以实现电子商务交易中的加密、认证机制、密钥管理机制等,保证在开放网络上使用信用卡进行在线购物的安全。由于SET提供商家和收单银行的认证,确保了交易数据的安全、完整可靠和交易的不可抵赖性,特别是具有保护消费者信用卡号不暴露给商家等优点,因此它成为目前公认的信用卡/借记卡的网上交易的国际标准。 SET协议采用了对称密钥和非对称密钥体制,把对称密钥的快速、低成本和非对称密钥的有效性结合在一起,以保护在开放网络上传输的个人信息,保证交易信息的隐蔽性。其重点是如何确保商家和消费者的身份和行为的认证和不可抵赖性,其理论基础是著名的非否认协议 (Non-repudiation),其采用的核心技术包括X。509电子证书标准与数字签名技术(Digital Signature)、报文摘要、数字信封、双重签名等技术。如使用数字证书对交易各方的合法性进行验证;使用数字签名技术确保数据完整性和不可否认;使用双重签名技术对SET交易过程中消费者的支付信息和定单信息分别签名,使得商家看不到支付信息,只能对用户的订单信息解密,而金融机构只能对支付和账户信息解密,充分保证消费者的账户和定货信息的安全性。 SET通过制定标准和采用各种技术手段,解决了一直困扰电子商务发展的安全问题,包括购物与支付信息的保密性、交易支付完整性、身份认证和不可抵赖性,在电子交易环节上提供了更大的信任度、更完整的交易信息、更高的安全性和更少受欺诈的可能性。-------------------------这个问题找不到吧,我想你应该自己收集的,不一定百度全知道,如果没人回答,建议找找一个一个的原理。-------------------------这东西好象不应该在这里解决的啊 你到操作系统那里 有高手的

小哇 2019-12-02 01:26:37 0 浏览量 回答数 0

问题

vtiger6.0 汉化bug集:报错

kun坤 2020-06-06 11:24:39 0 浏览量 回答数 1

回答

<p>在不动数据库的基础上,分批次查询再拼接吧</p> select SUBSTRING(content,1,100) from table select SUBSTRING(content,100,100) from table 这样多查几次 最后拼起来 <p>用mysql管理工具敲sql代码查询一下呢?</p> <div class="ref"> 引用来自“银杏果果”的评论 用mysql管理工具敲sql代码查询一下呢? 回复 <a class="referer" target="_blank">@银杏果果</a> : 谢谢 最好的报的错误发上来 <p>这么长的字符串就不适合做查询条件了,好比一片文章一样,查询它的意义何在呢。</p> 缩短的办法:用消息摘要的方法,很长的一段中文存储到数据库时,同时计算好它的哈希然后把哈希也存储到表。查询的时候计算哈希,然后直接对哈希做查询,查出来之后的结果再在Java里面做 equals 比对字符串(哈希也是不绝对唯一)。 DEMO表 ID长内容内容特征码自增几百字几千字...MD5 / SHA 这种肯定可以提高查询效率、降低数据库压力。 谢谢 回复 <a class="referer" target="_blank">@蓝水晶飞机</a> : 我觉得题主的问题不是把长字符串作为条件查询,不然sql中赋值这个条件也是不现实的,他应该就是以其它条件查询出结果中包含这个长字符串。 SELECT * FROM x_table WHERE content_hash=#{hash},如果返回的结果 >1条(说明哈希重复),则在业务里面 equals 查询结果字符串与查询条件字符串,找出匹配的结果行。 <p>应该修改jdbc的默认连接时间吧,把连接时间放长一点试试</p> 谢 谢

爱吃鱼的程序员 2020-06-06 10:46:25 0 浏览量 回答数 0

回答

您好, <一>. MD5加密算法: ? ? ? ?消息摘要算法第五版(Message Digest Algorithm),是一种单向加密算法,只能加密、无法解密。然而MD5加密算法已经被中国山东大学王小云教授成功破译,但是在安全性要求不高的场景下,MD5加密算法仍然具有应用价值。 ?1. 创建md5对象:? <pre name="code" class="java">MessageDigest md5 = MessageDigest.getInstance("md5"); ?2. ?进行加密操作:? byte[] cipherData = md5.digest(plainText.getBytes()); ?3. ?将其中的每个字节转成十六进制字符串:byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数。? String toHexStr = Integer.toHexString(cipher & 0xff); ?4. 如果该正数小于16(长度为1个字符),前面拼接0占位:确保最后生成的是32位字符串。? builder.append(toHexStr.length() == 1 ? "0" + toHexStr : toHexStr); ?5.?加密转换之后的字符串为:c0bb4f54f1d8b14caf6fe1069e5f93ad? ?6. 完整的MD5算法应用如下所示:? /** * 功能简述: 测试MD5单向加密. * @throws Exception */ @Test public void test01() throws Exception { String plainText = "Hello , world !"; MessageDigest md5 = MessageDigest.getInstance("md5"); byte[] cipherData = md5.digest(plainText.getBytes()); StringBuilder builder = new StringBuilder(); for(byte cipher : cipherData) { String toHexStr = Integer.toHexString(cipher & 0xff); builder.append(toHexStr.length() == 1 ? "0" + toHexStr : toHexStr); } System.out.println(builder.toString()); //c0bb4f54f1d8b14caf6fe1069e5f93ad } ?? <二>. 使用BASE64进行加密/解密: ? ? ? ? 使用BASE64算法通常用作对二进制数据进行加密,加密之后的数据不易被肉眼识别。严格来说,经过BASE64加密的数据其实没有安全性可言,因为它的加密解密算法都是公开的,典型的防菜鸟不防程序猿的呀。?经过标准的BASE64算法加密后的数据,?通常包含/、+、=等特殊符号,不适合作为url参数传递,幸运的是Apache的Commons Codec模块提供了对BASE64的进一步封装。? (参见最后一部分的说明) ?1.?使用BASE64加密:? BASE64Encoder encoder = new BASE64Encoder(); String cipherText = encoder.encode(plainText.getBytes()); ? 2.?使用BASE64解密:? BASE64Decoder decoder = new BASE64Decoder(); plainText = new String(decoder.decodeBuffer(cipherText)); ? 3. 完整代码示例:? /** * 功能简述: 使用BASE64进行双向加密/解密. * @throws Exception */ @Test public void test02() throws Exception { BASE64Encoder encoder = new BASE64Encoder(); BASE64Decoder decoder = new BASE64Decoder(); String plainText = "Hello , world !"; String cipherText = encoder.encode(plainText.getBytes()); System.out.println("cipherText : " + cipherText); //cipherText : SGVsbG8gLCB3b3JsZCAh System.out.println("plainText : " + new String(decoder.decodeBuffer(cipherText))); //plainText : Hello , world ! } ?? <三>. 使用DES对称加密/解密: ? ? ? ? ?数据加密标准算法(Data Encryption Standard),和BASE64最明显的区别就是有一个工作密钥,该密钥既用于加密、也用于解密,并且要求密钥是一个长度至少大于8位的字符串。使用DES加密、解密的核心是确保工作密钥的安全性。 ?1.?根据key生成密钥:? DESKeySpec keySpec = new DESKeySpec(key.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("des"); SecretKey secretKey = keyFactory.generateSecret(keySpec); ? 2.?加密操作:? Cipher cipher = Cipher.getInstance("des"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, new SecureRandom()); byte[] cipherData = cipher.doFinal(plainText.getBytes()); ? 3.?为了便于观察生成的加密数据,使用BASE64再次加密:? String cipherText = new BASE64Encoder().encode(cipherData); ? ? ?生成密文如下:PtRYi3sp7TOR69UrKEIicA==? ? 4.?解密操作:? cipher.init(Cipher.DECRYPT_MODE, secretKey, new SecureRandom()); byte[] plainData = cipher.doFinal(cipherData); String plainText = new String(plainData); ? 5. 完整的代码demo:? /** * 功能简述: 使用DES对称加密/解密. * @throws Exception */ @Test public void test03() throws Exception { String plainText = "Hello , world !"; String key = "12345678"; //要求key至少长度为8个字符 SecureRandom random = new SecureRandom(); DESKeySpec keySpec = new DESKeySpec(key.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("des"); SecretKey secretKey = keyFactory.generateSecret(keySpec); Cipher cipher = Cipher.getInstance("des"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, random); byte[] cipherData = cipher.doFinal(plainText.getBytes()); System.out.println("cipherText : " + new BASE64Encoder().encode(cipherData)); //PtRYi3sp7TOR69UrKEIicA== cipher.init(Cipher.DECRYPT_MODE, secretKey, random); byte[] plainData = cipher.doFinal(cipherData); System.out.println("plainText : " + new String(plainData)); //Hello , world ! } ?? <四>. 使用RSA非对称加密/解密: ? ? ? ? RSA算法是非对称加密算法的典型代表,既能加密、又能解密。和对称加密算法比如DES的明显区别在于用于加密、解密的密钥是不同的。使用RSA算法,只要密钥足够长(一般要求1024bit),加密的信息是不能被破解的。用户通过https协议访问服务器时,就是使用非对称加密算法进行数据的加密、解密操作的。 ? ? ? ?服务器发送数据给客户端时使用私钥(private key)进行加密,并且使用加密之后的数据和私钥生成数字签名(digital signature)并发送给客户端。客户端接收到服务器发送的数据会使用公钥(public key)对数据来进行解密,并且根据加密数据和公钥验证数字签名的有效性,防止加密数据在传输过程中被第三方进行了修改。 ? ? ? ?客户端发送数据给服务器时使用公钥进行加密,服务器接收到加密数据之后使用私钥进行解密。 ?1.?创建密钥对KeyPair: KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("rsa"); keyPairGenerator.initialize(1024); //密钥长度推荐为1024位. KeyPair keyPair = keyPairGenerator.generateKeyPair(); ? 2.?获取公钥/私钥: PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); ? 3.?服务器数据使用私钥加密: Cipher cipher = Cipher.getInstance("rsa"); cipher.init(Cipher.ENCRYPT_MODE, privateKey, new SecureRandom()); byte[] cipherData = cipher.doFinal(plainText.getBytes()); ? 4.?用户使用公钥解密: cipher.init(Cipher.DECRYPT_MODE, publicKey, new SecureRandom()); byte[] plainData = cipher.doFinal(cipherData); ? 5.?服务器根据私钥和加密数据生成数字签名: Signature signature = Signature.getInstance("MD5withRSA"); signature.initSign(privateKey); signature.update(cipherData); byte[] signData = signature.sign(); ? 6.?用户根据公钥、加密数据验证数据是否被修改过: signature.initVerify(publicKey); signature.update(cipherData); boolean status = signature.verify(signData); ? 7. RSA算法代码demo:<img src="http://www.cxyclub.cn/Upload/Images/2014081321/99A5FC9C0C628374.gif" alt="尴尬" title="尴尬" border="0"> /** * 功能简述: 使用RSA非对称加密/解密. * @throws Exception */ @Test public void test04() throws Exception { String plainText = "Hello , world !"; KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("rsa"); keyPairGenerator.initialize(1024); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); Cipher cipher = Cipher.getInstance("rsa"); SecureRandom random = new SecureRandom(); cipher.init(Cipher.ENCRYPT_MODE, privateKey, random); byte[] cipherData = cipher.doFinal(plainText.getBytes()); System.out.println("cipherText : " + new BASE64Encoder().encode(cipherData)); //gDsJxZM98U2GzHUtUTyZ/Ir/NXqRWKUJkl6olrLYCZHY3RnlF3olkWPZ35Dwz9BMRqaTL3oPuyVq //sehvHExxj9RyrWpIYnYLBSURB1KVUSLMsd/ONFOD0fnJoGtIk+T/+3yybVL8M+RI+HzbE/jdYa/+ //yQ+vHwHqXhuzZ/N8iNg= cipher.init(Cipher.DECRYPT_MODE, publicKey, random); byte[] plainData = cipher.doFinal(cipherData); System.out.println("plainText : " + new String(plainData)); //Hello , world ! Signature signature = Signature.getInstance("MD5withRSA"); signature.initSign(privateKey); signature.update(cipherData); byte[] signData = signature.sign(); System.out.println("signature : " + new BASE64Encoder().encode(signData)); //ADfoeKQn6eEHgLF8ETMXan3TfFO03R5u+cQEWtAQ2lRblLZw1DpzTlJJt1RXjU451I84v3297LhR //co64p6Sq3kVt84wnRsQw5mucZnY+jRZNdXpcbwh2qsh8287NM2hxWqp4OOCf/+vKKXZ3pbJMNT/4 ///t9ewo+KYCWKOgvu5QQ= signature.initVerify(publicKey); signature.update(cipherData); boolean status = signature.verify(signData); System.out.println("status : " + status); //true }

小哇 2019-12-02 01:26:34 0 浏览量 回答数 0

问题

solr语法如何转化?

轩墨 2019-12-01 21:03:53 891 浏览量 回答数 0

回答

摘抄:因为java读取read()方法时候,底层由c++实现,返回的是 unsigned byte ,取值范围为[0,255],而byte的取值范围是[-128,127], 那么[128, 255]就没有办法表示了,然后就会把byte升级为int,int就可以表示[128,255], 不过为什么不用short去接受返回呢???菜鸟求解######回复 @快乐的一只小青蛙 : 糊涂之言,勿怪!!######回复 @kakai : short是C语言的基本类型之一。 C语言整形数据包括char、short、int、long######Java没有unsigned###### 对于你问题的具体回答 [详细描述]###### 哪儿矛盾了,返回的int值表示读取的字节数,并不是读取到的字节######可是,调用 public abstract int read() throws IOException,返回的是 0 到 255 范围内的 int 字节值。###### 摘要 调用 read(), 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。 调用 read(byte[] b), 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。 1.    的确,public abstract int read()                                   throws IOException 输入流中读取数据的下一个字节。但是,返回的是 0 到 255 范围内的 int 字节值。一个字节能表示的最大的整数就是255(二进制11111111=十进制255)。所以,返回值的类型是 int。"read()的底层是由C++实现的,返回的是unsigned byte,取值范围为[0~255],在java中没有对应的类型,所以只能用int类型接收"。 中文字符,(至少)需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。java 字符型变量,使用 UNICODE。UNICODE 通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。比如,一个中文字符 '中', 对应的 Unicode 十进制编码是: 20013。于是,要读取 '中',就必须连续读入两个字节。按 UNICODE 编码,才能够将这两个二进制字节值"合成",将"合成"结果,成功转换成相应的中文字符。 如下代码,详述通过 java 使用的 Unicode 编码 读取 中文字符的案例。 这里,通过建立一个 BigInteger 对象,获得 长度为2的字节数组 byte bete[]。分别检查这两个字节的二进制表示, 即输出 每个字节元素的字节值,及其二进制表示。从输出结果可以看出,将两个(整型)字节值 78( 二进制:01001110)   和 45( 二进制:00101101) 的二进制表示,“合成” 到一起,就是 字符'中' 的Unicode编码 20013, 即 0100111000101101(二进制) 。  import java.math.BigInteger; public class ByteArray1 { public static void main(String[] args) { int zhong = (int)'中'; System.out.println( "字符 '"+ (char)zhong + "',其 UNICODE: " + zhong + "(十进制)"); // 通过建立一个 BigInteger 对象,获得 长度为2的字节数组 byte bete[]。 BigInteger b = new BigInteger(String.valueOf(zhong)); String zh = b.toString(2); System.out.println( addZero(zh, 16) + "(二进制)" ); // 输出字符 '中' 的 二进制的字符串形式 byte bete[] = b.toByteArray();//返回一个 byte 数组,该数组包含此 BigInteger 的二进制补码表示形式。 for (int j=0; j<bete.length ; j++){ byte bn = bete[j]; String str = Integer.toBinaryString(bn); System.out.println( bn + "( 二进制: " + addZero(str, 8) + ")"); // 输出 每个字节元素的字节值的二进制表示 } } /* 将一个 整型 (16位) 或 字节(8位) 转化成 二进制表示的字符串时, * 若字符串长度不足 16位 或 8位 时,将空位补 0。 */ static String addZero(String s, int length){ String add=""; for(int k=0; k< ( length - s.length()); k++) add += "0"; return add + s; } } 输出: 字符 '中',其 UNICODE: 20013(十进制) 0100111000101101(二进制) 78( 二进制: 01001110) 45( 二进制: 00101101) 2.     如果调用 方法  public int read(byte[] b)          throws IOException 其功能是:"从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数"。注意,这时读取到的输入流的每个字节的值,依次存入缓冲区数组 b 的各个元素之中。 结论: 调用 read(), 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。调用 read(byte[] b), 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在字节流的基础上,加上编码,形成的数据流。字符流虽然以字节流为基础创建的,但是字节流可以支持声音,视频,图片,文本等所有文件类型,而字符流只支持文本文件。ASCII码:美国信息交换标准代码。单字节编码,不支持中文。Unicode/utf-8  :双字节编码,支持中文(万国码)。java 使用 Unicode。    参考: Java:InputStream中的read()返回int类型的疑问Java I/O(字节流、字符流与转换流)Java中字符流与字节流的区别###### 引用来自“yong230”的评论 哪儿矛盾了,返回的int值表示读取的字节数,并不是读取到的字节 我也这样认为######如果调用 方法 public int read(byte[] b) throws IOException 其功能是:从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。注意,读取到的输入流的每个字节值,依次存入缓冲区数组 b 的各个元素之中。调用 read(), 返回字节的值。###### 还有这么多人,居然方法的功能都不知道,, read和read(byte[])的功能都不同,

kun坤 2020-06-07 20:03:19 0 浏览量 回答数 0

问题

怎么推送高级接口?

猫饭先生 2019-12-01 21:55:02 817 浏览量 回答数 0

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播