前些時候,大概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.net給
webmaster@ph4nt0m.org發郵件,試圖取得他的信任,這種問題如何處理?好辦,使用非對稱加密的簽名驗證功能。
首先,我在
http://mail.icylife.net/publickey.txt存放我的公鑰文件,私鑰自己保存好。然后對郵件服務器進行一些改進,對于本域發出去的所有郵件,包括郵件正文和接受者一起做一個簽名,把簽名附在郵件中一起發出去。而mail.ph4nt0m.org域中的郵件服務器在接收郵件時,從
http://mail.icylife.net/publickey.txt取得我的公鑰,對簽名進行驗證,如果簽名不對,馬上提示用戶遭受源域名偽造攻擊。對于攻擊者來說,他沒有我的私鑰,是不可能偽造出同樣的簽名的。
原文地址:http://www.icylife.net/yunshu/show.php?id=471
posted on 2007-11-25 09:29
matthew 閱讀(356)
評論(0) 編輯 收藏 所屬分類:
網站應用