当前位置:文档之家› RSA密码传输加密方案

RSA密码传输加密方案

RSA密码传输加密方案对应的【鲁能集团泰山度假俱乐部产品展示系统安全功能初测观察报告】中的(5,6)互联网的发展史上,安全性一直是开发者们相当重视的一个主题,为了实现数据传输安全,我们需要保证:数据来源(非伪造请求)、数据完整性(没有被人修改过)、数据私密性(密文,无法直接读取)等。

虽然现在已经有SSL/TLS协议实现的HTTPS协议,但是因在客户端上依赖浏览器的正确实现,而且效率又很低,所以一般的敏感数据(如交易支付信息等)还是需要我们使用加密方法来手动加密。

虽然对于一般的WEB开发人员来说,大可不必深入了解一些安全相关的底层技术,但学习加密基础知识,使用现有加密相关工具却十分必要。

由于工作需要,自己看了些加密相关文章,结合自己的使用经历,完成此文。

RSA加密算法是一种非对称加密算法。

在公钥加密标准和电子商业中RSA被广泛使用。

RSA是1977年由罗纳德•李维斯特(Ron Rivest)、阿迪•萨莫尔(Adi Shamir)和伦纳德•阿德曼(Leonard Adleman)一起提出的。

当时他们三人都在麻省理工学院工作。

RSA就是他们三人姓氏开头字母拼在一起组成的。

加密基础学习如何使用加密之前,我们需要了解一些加密相关的基础知识。

加密算法一般分为两种:对称加密算法和非对称加密算法。

对称加密对称加密算法是消息发送者和接收者使用同一个密匙,发送者使用密匙加密了文件,接收者使用同样的密匙解密,获取信息。

常见的对称加密算法有:des/aes/3des.对称加密算法的特点有:速度快,加密前后文件大小变化不大,但是密匙的保管是个大问题,因为消息发送方和接收方任意一方的密匙丢失,都会导致信息传输变得不安全。

非对称加密与对称加密相对的是非对称加密,非对称加密的核心思想是使用一对相对的密匙,分为公匙和私匙,私匙自己安全保存,而将公匙公开。

公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。

发送数据前只需要使用接收方的公匙加密就行了。

常见的非对称加密算法有RSA/DSA:非对称加密虽然没有密匙保存问题,但其计算量大,加密速度很慢,有时候我们还需要对大块数据进行分块加密。

数字签名为了保证数据的完整性,还需要通过散列函数计算得到一个散列值,这个散列值被称为数字签名。

其特点有:∙无论原始数据是多大,结果的长度相同的;∙输入一样,输出也相同;∙对输入的微小改变,会使结果产生很大的变化;∙加密过程不可逆,无法通过散列值得到原来的数据;常见的数字签名算法有md5,hash1等算法。

PHP的openssl扩展openssl扩展使用openssl加密扩展包,封装了多个用于加密解密相关的PHP函数,极大地方便了对数据的加密解密。

常用的函数有:对称加密相关:string openssl_encrypt ( string $data , string $method , string $password)其中$data为其要加密的数据,$method是加密要使用的方法,$password是要使用的密匙,函数返回加密后的数据;其中$method列表可以使用openssl_get_cipher_methods()来获取,我们选取其中一个使用,$method列表形如:其解密函数为string openssl_encrypt ( string $data , string $method , string $password)非对称加密相关:它们都只需要传入证书文件(一般是.pem文件);使用公匙加密数据,其中$data是要加密的数据;$crypted是一个引用变量,加密后的数据会被放入这个变量中;$key是要传入的公匙数据;由于被加密数据分组时,有可能不会正好为加密位数bit的整数倍,所以需要$padding(填充补齐),$padding的可选项有OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING,分别为PKCS1填充,或不使用填充;与此方法相对的还有(传入参数一致):还有签名和验签函数:验签函数:与签名函数相对,只不过它要传入与私匙对应的公匙;其结果为签名验证结果,1为成功,0为失败,-1则表示错误;加密流程传输流程:传输过程中rsa加密用户名和口令,md5密钥加密用户名和口令和验证码,对比的时候是把传输的rsa解密加上验证码,再进行md5验证JS加密代码:<scriptlanguage="JavaScript"type="text/javascript"src="/static/web/js /rsa/jsbn.js"></script><scriptlanguage="JavaScript"type="text/javascript"src="/static/web/js /rsa/prng4.js"></script><scriptlanguage="JavaScript"type="text/javascript"src="/static/web/js /rsa/rng.js"></script><scriptlanguage="JavaScript"type="text/javascript"src="/static/web/js /rsa/rsa.js"></script><scriptlanguage="JavaScript"type="text/javascript"src="/static/web/js /rsa/base64.js"></script><scripttype="text/javascript"src="/static/web/js/md5.js"></script> <script language="JavaScript">varpublic_key="<?='BB3DC79A95B19C104EE49F592EBA635A3FA6CC6380F8CF F8D2A65E04724AE9C4ACB8E6CDA15B75BC5B94B21CBD6F433B7396E1B52D32 F5B610453C49AFD7F39355086250695698B0281032DEADDCA3938AF8590DE6 458FAD597DB1C3D9F53D5171968FCF2EE042D99B57414BF376793979A4951D EDBD80E84679EC5CDDAC3C65'?>";var public_length="0x10001";function do_encrypt() {var rsa = new RSAKey();rsa.setPublic(public_key, public_length);var res =rsa.encrypt('username='+$('#username').val()+'&password='+$('# password').val());var res_cap = '';if($('#captcha').val()){res_cap = rsa.encrypt($('#captcha').val());}if(res && res_cap) {$('#sign').val($.md5('username='+$('#username').val()+'&passwo rd='+$('#password').val() + $('#captcha').val()));var result = hex2b64(res);$('#data').val(result);$('#captcha_hidden').val(hex2b64(res_cap));$('#loginform').submit();}return true;}服务端生成一组公钥与私钥,将公钥发送给客户端进行密码加密,在使用密钥进行解密,相关代码:Rsa.phpclass Rsa{//openssl生成秘钥时的e的值public $rsae;//openssl生成的modulus,十六进制数据public $rsa_modules;public function __construct() {$this->rsae = '0x10001';$this->rsa_modules ='BB3DC79A95B19C104EE49F592EBA635A3FA6CC6380F8CFF8D2A65E04724AE 9C4ACB8E6CDA15B75BC5B94B21CBD6F433B7396E1B52D32F5B610453C49AFD 7F39355086250695698B0281032DEADDCA3938AF8590DE6458FAD597DB1C3D 9F53D5171968FCF2EE042D99B57414BF376793979A4951DEDBD80E84679EC5 CDDAC3C65';}/*** @param $data 要加密的字符串* @param $private_key 公钥* @return mixed 加密的结果*/public function publicDecrypt($data, $public_key){$public_key = file_get_contents($public_key);$pub_key = openssl_pkey_get_public($public_key);openssl_public_encrypt($data,$encrypted,$pub_key); $encrypted=base64_encode($encrypted);//因为加密后是乱码,所以base64一下return $encrypted;}/*** @param $data 要解密的字符串* @param $private_key 私钥* @return mixed 解密的结果*/public function privateDecrypt($data, $private_key){ $encrypted = base64_decode($data);$private_key = file_get_contents($private_key);$pi_key = openssl_pkey_get_private($private_key);openssl_private_decrypt($encrypted,$decrypted,$pi_key); return $decrypted;}}控制器实现:$this->load->library('Rsa');$rsa = new Rsa();$captcha = request_post('captcha');$decrypt_cap = $rsa->privateDecrypt($captcha,$this->_config['rsa_private_key']);if (strtolower($this->session->userdata('captcha')) !=strtolower($decrypt_cap)) {$this->message('验证码不正确', site_url($this->siteclass . '/' . $this->sitemethod), 2);}$decrypt_data = $rsa->privateDecrypt($this->input->post('data', true), $this->_config['rsa_private_key']);if (!$decrypt_data) {$this->systemlog('信息验证错误,请重新登录', 0, 4);sendmail_windows($this->data['webset']['admin_email'], '有管理员有登录异常操作', '管理员登录时签名信息被篡改,请检查,登录时间' . date('Y-m-d H:i:s'));$this->jump('信息错误,请重新登录', site_url('admincp/login'), 2); }parse_str($decrypt_data, $form_data);$username = trim($form_data['username']);$password = trim($form_data['password']);//验证传输有效性$sign = request_post('sign');$make_sign = md5($decrypt_data . strtolower($decrypt_cap));if ($make_sign != $sign) {$this->systemlog('登录时签名可能被篡改', 0, 4);$this->jump('信息错误,签名信息不正确', site_url('admincp/login'), 2);}鲁能泰山度假俱乐部管理有限公司。

相关主题