CA加密,网络安全HTTPS SSL-RSA非对称加密的一些非常规应用

Submitted by 云舒 on 2007, October 1, 9:09 PM. 技术
RSA非对称加密的一些非常规应用 Author:云舒 Team:Ph4nt0m 可以随意转载,但是必须保留ph4nt0m的版权所有,谢绝商业用途。 前些时候,大概7月份看了些SSL协议的东西,对前人非常的佩服。把非对称加密的安全性和对称加密的快速性结合起来使用,保留了各自的长处。整个数据传输过程中,通过非对称加密在不安全的区域安全的传输了用于对称加密的密钥,实在是创造性的思维。 前天晚上洗澡的时候,突然有了几个新的想法,加上以前的一点发现,就有了这篇文章和几行代码。现在觉得非对称加密还真的很有意思啊,洗澡也很有意思,难怪阿基米德洗澡能够发现浮力定理。我们不够强大,可能是因为洗澡不够吧。 一. RSA替换HTTPS保证安全传输敏感数据 目前大多数的web应用在注册或者登录的时候,或者其他任何涉及到用户帐户,密码,以及信用卡号等等敏感数据传输的时候,一般都毫不犹豫的采用了HTTPS加密传输的方式来进行。比如Gmail,Yahoo Mail,Live Mail等国际性的邮箱,都是用了这种方式。确实,使用HTTPS是一种比较安全的方法,但是这样做从成本角度来说,并不是最优的。 使用1024位密钥的HTTPS传输,在相同硬件配置的情况下,性能基本上要损失掉30%左右。大量的CPU时间花费到了对数据的加密解密以及证书认证,传输,SSL握手等方面。对于千万用户级别的应用这些损失是难以忽略掉的,因此大公司一般都会购买SSL硬件加密卡,使用硬件进行加密解密。 鉴于RSA等非对称加密算法的public key是可以公开的,因此可以使用这种方式来传输数据,在某些场合取代昂贵的HTTPS传输。比如在邮箱的登录入口,用户点击提交按钮的时候,在本地使用JS代码将用户名和密码进行RSA加密。虽然public key明文存在于JS代码中,客户端可见,但是仅仅具备public key是无法推算出private key的,因此无法对加密后的数据进行捕获分析,加密后的数据可以安全的通过互联网传输。 前些时间对国内国外的一些大型网站登录入口做了些分析,发现只有tencent的邮箱是使用的这种方式。他们用JS做了一个类,提供RSA加密算法的各种方法,在邮箱登录表单提交的时候调用加密。JS类的地址为http://mail.qq.com/zh_CN/htmledition2/js/safeauth.js,有兴趣的可以自己去研究。使用这种方式之后,服务端的计算量大大减少,只需要在用户提交的时候进行一次解密操作就可以了。而且这个解密,可以使用C语言做成模块,给前端展现语言调用,提高效率。如果有更高的安全性考虑,可以做一些改进,比如在客户端提交表单之前,在发送数据里面加入完整性检验等等,自由发挥即可。 二. 独立的水印系统 现在的论坛或者blog,都需要使用水印来防范强行破解密码的攻击方式,和防范发帖机器人的破坏。但是很多水印和应用系统结合在一起,不方便扩充和给第三方提供服务。这几天想到可以使用RSA加密来实现一套独立的水印算法,并且可以方便的提供给任意的第三方安全使用。 主要思路是这样的,首先生成一对公钥和私钥。将公钥发布给需要使用水印服务的第三方,私钥保存在水印生成方。在使用方随机生成一个字符串,随后使用水印方提供的public key,使用RSA算法进行加密,将加密后的字符串发送给生成水印方。生成方使用private key对这个字符串进行解密,画出图形,将数据传输给水印使用方。虽然加密后的字符串在水印使用方的HTML源代码中明文可见,但是同上所说的,没有private key是无法解密的。对于安全性的一些加强,可以考虑同时在使用方与生成方之间共享一个用于对称加密的字符串。先对随机生成的水印数字进行对称加密,然后再RSA非对称加密,这样可以在万一丢失private key的情况下,仍然不容易马上被攻破。 为了验证我的这个思路,今天写了一小段验证代码,发现还是比较好用的。我主要是把Pear里面的RSA类扒出来了,稍微改了一点点,然后做了一套测试系统。简单的代码如下,详细的见附件。 代码:
/* Global.php  通用函数,调用RSA类提供加密解密功能。 云舒 , 2007年10月1日 */ function encrypt( $plain_text ) {     $public_key = 'YTozOntpOjA7czozMjoiS1vW5NNLH39farB+HPE/U0A1fs1I7ja81GJxGrrjsYEiO2k6MTtzOjM6IgEAASI7aToyO3M6NjoicHVibGljIjt9';          $key = Crypt_RSA_Key::fromString($public_key);     check_error($key);     $rsa_obj = new Crypt_RSA;     check_error($rsa_obj);     $enc_text = $rsa_obj->encrypt($plain_text, $key);     check_error($rsa_obj);          return $enc_text; } function decrypt( $enc_text ) {     $private_key = "YTozOntpOjA7czozMjoiS1vW5NNLH39farB+HPE/U0A1fs1I7ja81GJxGrrjsYEiO2k6MTtzOjMyOiIButTavL72eeXVEa8E5WkAJthoHqmHIyo3HblsSJG0aiI7aToyO3M6NzoicHJpdmF0ZSI7fQ==";          $key = Crypt_RSA_Key::fromString($private_key);     check_error($key);     $rsa_obj = new Crypt_RSA;     check_error($rsa_obj);     $rsa_obj->setParams(array('dec_key' => $key));     check_error($rsa_obj);     $number = $rsa_obj->decrypt($enc_text);          return $number; }
代码:
/* 水印需求方,随机生成字符串,然后加密发送给水印生成方 云舒 , 2007年10月1日 */ require_once 'Global.php'; $chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; $str_a = $chars; $str_b = $chars; $str_c = $chars; $str_d = $chars; $str = $str_a.$str_b.$str_c.$str_d; $enc_data = encrypt( $str ); echo '<html><head><title>test</title></head><body><img src="CreateImg.php?number=' .rawurlencode( $enc_data ). '" /></body></html>';
代码:
/* 水印提供方,获取需求方传递过来的参数,解密,画出图形 云舒 , 2007年10月1日 */ require_once 'Global.php'; header('Content-type: image/gif'); if( isset( $_GET["number"] ) ) {     $enc_number = rawurldecode( $_GET["number"] ); } else {     exit; } $de_number = decrypt( $enc_number ); $chars = preg_split( '//', $de_number ); $im = imagecreate(75,30); $bg = imagecolorallocate($im, 255, 255, 255);//背景 $font_color = imagecolorallocate($im, 0, 0, 0);//字 imagestring($im, mt_rand(5,9), mt_rand(0,5), mt_rand(0,5), $chars[1], $font_color); imagestring($im, mt_rand(5,9), mt_rand(15,25), mt_rand(0,5), $chars[2],  $font_color); imagestring($im, mt_rand(5,9), mt_rand(30,40), mt_rand(0,5), $chars[3],  $font_color); imagestring($im, mt_rand(5,9), mt_rand(45,50), mt_rand(0,5), $chars[4],  $font_color); // 随机点 for ($i=1; $i<=10; $i++) {     imagestring($im,mt_rand(0,5),mt_rand(-5,63),mt_rand(-5,23),".",imageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255))); }      imagegif($im); imagedestroy ($im);
三. 防御伪造域的垃圾邮件 垃圾邮件现在也是网络上很头疼的一个问题,使用非对称算法的签名功能,可以对伪造域的垃圾邮件进行鉴别,需要邮件接收方服务器的支持。理论不多说了,直接举例。假设我是mail.icylife.net域,我给mail.ph4nt0m.org发邮件。但是有人自己架设了mail服务器,伪装成webmaster@icylife.netwebmaster@ph4nt0m.org发邮件,试图取得他的信任,这种问题如何处理?好办,使用非对称加密的签名验证功能。 首先,我在http://mail.icylife.net/publickey.txt存放我的公钥文件,私钥自己保存好。然后对邮件服务器进行一些改进,对于本域发出去的所有邮件,包括邮件正文和接受者一起做一个签名,把签名附在邮件中一起发出去。而mail.ph4nt0m.org域中的邮件服务器在接收邮件时,从http://mail.icylife.net/publickey.txt取得我的公钥,对签名进行验证,如果签名不对,马上提示用户遭受源域名伪造攻击。对于攻击者来说,他没有我的私钥,是不可能伪造出同样的签名的。 以上几个想法,一直一来有个朦胧的感觉,但是一直抓不住,前几天洗澡的时候,突然明朗起来了。或者有人说,RSA这些非对称加密是可以破解的,我只能说,地球都会毁灭,何况是加密算法。
 
 
评论
 
已转载,嘿嘿!
Post by Neeao on 2007, October 1, 10:26 PM
自己补充一下,其实这里代替HTTPS还是有一些缺陷的。 虽然节省了服务器资源,但是在遇到中间人攻击的时候比https表现差很多。HTTPS虽然无法避免中间人,但是会报警证书无效。具体可参见www.icylife.net/yunshu/show.php?id=494和pstgroup.blogspot.com/2007/11/tipsqqrsa.html
Post by 云舒 on 2007, November 23, 5:12 PM
既然实施中间人攻击,伪装整个界面岂不是更好。
Post by Gomain on 2007, November 25, 9:28 AM
可以伪装整个界面,但是实际中没有太多意义,这是因为你没法写一个通用程序出来,每个网站的界面都不一样。即使你从配置文件读取界面文件,任然要为每次攻击作一个伪造界面。我曾经写过的https劫持,只是在劫持了之后,抓取明文密码,没必要伪造界面,我直接转发整个界面就可以了。这个代码我blog有,地址为www.icylife.net/yunshu/show.php?id=468,你可以看看。
Post by 云舒 on 2007, November 25, 1:11 PM
rsa算法单独存在是没有意义的。 必须结合数字证书,虽然公钥可以公开,但是谁来证明这份公钥是你的. 这就需要ca给这份公钥+公钥的持有人身份信息签名. 而且云舒所说的https中间人攻击其实不是ssl协议的漏洞.提示证书无效已经告诉你攻击失败了.只是ie浏览器程序可以让用户继续而已. 也就是使用ssl或pki有个很重要的前提,通信双方可以不信任,但是他们必须信任某个CA. 故,保管好你信任的ca根证书是何等的重要.
Post by eboymcy on 2007, November 29, 3:23 PM
启用https的目的不只是数据加密,还有防止钓鱼的目的. 对于商业网站来说,https不可避免,象tencent那样就没有大多的意义了。都能达到加密的目的. ssl只是握手消耗资源,因为涉及到rsa 私钥解密. 象tencent那样客户端js加密,服务器端每次都是rsa私钥解密,也是很消耗资源的. ---个人看法,只供探讨
Post by eboymcy on 2007, November 29, 3:38 PM
1. 不光IE浏览器,所有的浏览器都会让用户继续,关键是没有多少用户会真的停止当前操作,因为很多网站的ssl证书本来就是自己签署的,会出现不信任提示。 2. https比较好的地方就是可以报警,虽然很多人不管这个。tencent那个rsa加密那里,并不是把所有的数据都作了加密,仅仅是加密了密码这一个字段而已,因此服务器消耗的资源要比https的小很多,当然安全性上https要比单纯的rsa好一些。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值