關於PHP加解密的懶漢入門篇(API安全增強篇一)

  1. 懶漢
  2. 入門

這兩點就足以說明這篇文章不想要着有什麼高端大氣的技術內容,我跟你講,全是水。不可能有什麼質數素數、橢圓曲線加密、迪菲-赫爾曼什麼的,不可能有的。php

首先我不懂,其次,反正大家也不懂。git

不過這裏仍是要先說一點兒,就是不少泥腿子一直拿md5當加密算法來看待,但實際上md5是一種信息摘要算法(其實就是哈希),不是加密算法,由於md5不可逆,可是加解密是一個可逆的過程,因此之後這種低級錯誤仍是不要犯的爲好。github

加密技術一直是技術圈中的一個獨特領域和分支,其一些原理並非隨隨便便就能夠理解的來的。若是沒有良好的數學底子,怕是很難研究下去。可是,做爲一篇水文,不研究原理,僅僅來用一用來實踐一把,仍是沒什麼大問題的。算法

加密分爲兩大類:安全

  • 對稱加密,常見算法有DES、3DES、AES等等,聽說AES是比較屌的最新最經常使用的算法
  • 非對稱加密,RSA、DSA、ECDH等等

對稱加密用粗話說就是用同一個密鑰對信息加解密。好比元首要操做東線戰場了,給古德里安發了一段電報,大概意思就是「你給我閃開,讓我操做!立馬南下打基輔!」,可是元首又怕朱可夫給看到這段消息,因而元首就用了一個強壯的密鑰123456來加密這段話,而後這段話就變成akjdslfjalwjglajwg了。古德里安收到這坨亂七八糟的玩意後,用123456來解密一下,獲得明文「你給我閃開,讓我操做!立馬南下打基輔!」,然而朱可夫因爲抓破腦袋也想不到這個超級密鑰123456,因此朱可夫註定一臉懵逼,最終致使基輔60萬蘇軍被奸!可是這裏面有一個問題就是元首是如何告訴古德里安私鑰是123456的。微信

  1. 兩我的提早就商量好了,1941年6月22日的前一天偷偷商量好了。。。
  2. 兩我的不是提早商量好的,而是古德里安到東線後,元首經過打電話、發電報、QQ、微信。。。 。。。

對於朱可夫來講,若是對方採用了方案1,那麼他也沒啥好辦法,只能等潛伏在古德里安身邊的特工臥底返回123456。因爲密鑰被暴露了,因此必須換新的密鑰,元首這會兒只能走途徑2告訴古德里安新的密鑰,這會兒逗逼的事情來了,如何對密鑰進行加密。答案是不能,此時問題陷入到欲要加密,必先加密的矛盾中。因此,這個密鑰是註定要經過明文傳輸了,只要是明文傳輸,朱可夫就必定有機會把密鑰搞到手。測試

非對稱加密就是解決這個難題而生。密鑰換來換去還想不暴露,扯犢子。仍是元首和古德里安,這會兒他倆分別生成一對本身的公鑰和私鑰。這裏須要強調的是:ui

  1. 公鑰和私鑰是成雙成對生成的,兩者之間經過某種神祕的數學原理鏈接着,具體是啥,我也不知道
  2. 公鑰加密的數據,只能經過相應的私鑰解密;私鑰加密的數據,只能經過對應的公鑰解密
  3. 公鑰能夠頒發給任何人,然而私鑰你本身偷偷摸摸藏到本身褲襠裏,別弄丟了

這會兒就簡單了,元首把本身公鑰給古德里安,而後古德里安把本身公鑰給元首,而後都偷偷摸摸保存好本身的私鑰。有一天,元首告訴古德里安「你丫別幹了,每天不聽我操做!」,而後用古德里安頒發的公鑰加密好了,而後讓空軍到東線直接仍傳單,扔的滿地都是,古德里安看到後從褲襠裏拿出本身的私鑰解密,而後就立馬請假回家休息了,回去前用元首的公鑰加密了以下消息「傻逼,老子還不伺候了!」,而後讓空軍回去撒了柏林一地,元首看到後從褲襠裏拿出本身的私鑰一解密:「臥槽。。。」。雖然這雙方都是大大咧咧的發傳單,可是朱可夫只能在旁邊一臉懵逼、生無可戀。由於用於解密的私鑰歷來不會在外流通,因此,泄露的可能性是0。加密

可是,有一點是值得說明,那就是不管是對稱加密仍是非對稱加密,都頂不住用機器是強行暴力猜解私鑰。一年不行兩年,兩年不行二十年,二十年不行一百年,老是能猜出來的,這是沒有辦法的一件事情。你們能夠搜一搜關於768bit RSA被KO的事件,是吧。spa

下面咱們從gayhub上扒了一個對稱加密的庫下來,嘗試一把aes對稱加密算法,地址以下:

https://github.com/ivantcholakov/gibberish-aes-php

直接git clone到目錄中,而後測試代碼以下:

<?php
require 'GibberishAES.php';
$pass   = '123456';
$string = '你好,古德里安,我是希特勒,你趕忙給我滾回來...';
GibberishAES::size(256);
$encrypted_string = GibberishAES::enc( $string, $pass );
$decrypted_string = GibberishAES::dec( $encrypted_string, $pass );
echo PHP_EOL."加密後的:".$encrypted_string.PHP_EOL;
echo "解密後的:".$decrypted_string.PHP_EOL.PHP_EOL;

保存爲test.php,運行一下結果以下:

而後咱們將上面代碼反覆運行100,000次,看看耗費多長時間:

require 'GibberishAES.php';
$pass   = '123456';
$string = '你好,古德里安,我是希特勒,你趕忙給我滾回來...';
GibberishAES::size(256);
$start_time = microtime( true );
for( $i = 1; $i <= 100000; $i++ ) {
  $encrypted_string = GibberishAES::enc( $string, $pass );
  $decrypted_string = GibberishAES::dec( $encrypted_string, $pass );
}
$end_time = microtime( true );
echo "一共耗時:".( $end_time -  $start_time ).PHP_EOL;

保存爲test.php,運行一下結果以下:

而後,咱們再去gayhub上扒一個非對稱加密的library,好比這個:

https://github.com/vlucas/pik...

咱們把代碼扒下來,而後本身寫個demo試一下,以下:

<?php
$publicKey = '
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7o9A47JuO3wgZ/lbOIOs
Xc6cVSiCMsrglvORM/54StFRvcrxMi7OjXD6FX5fQpUOQYZfIOFZZMs6kmNXk8xO
hgTmdMJcBWolQ85acfAdWpTpCW29YMvXNARUDb8uJKAApsISnttyCnbvp7zYMdQm
HiTG/+bYaegSXzV3YN+Ej+ZcocubUpLp8Rpzz+xmXep3BrjBycAE9z2IrrV2rlwg
TTxU/B8xmvMsToBQpAbe+Cv130tEHsyW4UL9KZY1M9R+UHFPPmORjBKxSZvjJ1mS
UbUYN6PmMry35wCaFCfQoyTDUxBfxTGYqjaveQv4sxx0uvoiLXHt9cAm5Q8KJ+8d
FwIDAQAB
-----END PUBLIC KEY-----
';
$privateKey = '
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA7o9A47JuO3wgZ/lbOIOsXc6cVSiCMsrglvORM/54StFRvcrx
Mi7OjXD6FX5fQpUOQYZfIOFZZMs6kmNXk8xOhgTmdMJcBWolQ85acfAdWpTpCW29
YMvXNARUDb8uJKAApsISnttyCnbvp7zYMdQmHiTG/+bYaegSXzV3YN+Ej+Zcocub
UpLp8Rpzz+xmXep3BrjBycAE9z2IrrV2rlwgTTxU/B8xmvMsToBQpAbe+Cv130tE
HsyW4UL9KZY1M9R+UHFPPmORjBKxSZvjJ1mSUbUYN6PmMry35wCaFCfQoyTDUxBf
xTGYqjaveQv4sxx0uvoiLXHt9cAm5Q8KJ+8dFwIDAQABAoIBAHkWS3iHy/3zjjtY
TV4NL8NZqO5splGDuqXEMbKzenl3b8cnKHAxY/RVIQsh3tZb9CV8P/Lfj1Fi+nLt
a7mAXWcXO6aONMkmzI1zQ2NL3opoxTRc+GAWd0BW5hcoMBK1CD+ciHkLqAH5xsFc
UFxSc5qfTkb79GMlQZYD/Hk2WwHyj7hAkyxip4ye1EOnH5h8H7vIUjwp+H6Rmt5w
FTiVJbokhzwiczChUJVWgnowegL/qFV+yNfHGGKqVdIQfKdCsHR6jAuKCww5QniN
qDEi/M2Az0R4qfVmf38uMvOJTWaxp08JV4qRyNdh6hhbj+nY1EZ8haOiC7tjz2mJ
XqqKQfkCgYEA95yb5ezTBF4Pbr589OnU6VFdM88BCrKKvSWE8D1fzZZTsXur5k/x
cOwfio4RkmJwMnjuzZN6nvL5QddfcmPWQAoepHR8eA9yhIz57YWgrqE9ZXI8DgMy
SFuy5EkV5vudjDIr7kBXaGuUh3ErZfglyrV/rUfydGdTWyY8phMq/6MCgYEA9qQj
7kb5uyU8nrXoDqKPpy6ijEpVilgy4VR7RuB2vMh74wKI1QQYED+PxfcHe5RP8WGF
Bl+7VnmrGka4xJWeN7GKW4GRx5gRAzg139DXkqwPlXyM3ZR3pLd8wtbxTmJrcPby
A6uNRhGPpuyhDs5hx9z6HvLoCs+O0A9gDaChM/0CgYEAycRguNPpA2cOFkS8l+mu
p8y4MM5eX/Qq34QiNo0ccu8rFbXb1lmQOV7/OK0Znnn+SPKITRX+1mTRPZidWx4F
aLuWSpXtEvwrad1ijuzTiVk0KWUTkKuEHrgyJplzcnvX3nTHnWXqk9kN9+v83CN/
0BVji7TT2YyUvPKEeyOlZxcCgYABFm42Icf+JEblKEYyslLR2OnMlpNT/dmTlszI
XjsH0BaDxMIXtmHoyG7434L/74J+vQBaK9fmpLi1b/RmoYZGFplWl/atm6UPj5Ll
PsWElw+miBsS6xGv/0MklNARmWuB3wToMTx5P6CTit2W9CAIQpgzxLxzN8EYd8jj
pn6vfQKBgQCHkDnpoNZc2m1JksDiuiRjZORKMYz8he8seoUMPQ+iQze66XSRp5JL
oGZrU7JzCxuyoeA/4z36UN5WXmeS3bqh6SinrPQKt7rMkK1NQYcDUijPBMt0afO+
LH0HIC1HAtS6Wztd2Taoqwe5Xm75YW0elo4OEqiAfubAC85Ec4zfxw==
-----END RSA PRIVATE KEY-----
';
require 'RSA.php';
$rsa       = new RSA( $publicKey, $privateKey );
$data      = '你好,古德里安,我是希特勒,你趕忙給我滾回來...';
$encrypted = $rsa->encrypt( $data );
$decrypted = $rsa->decrypt( $encrypted );
echo "加密事後的:".$encrypted.PHP_EOL;
echo "解密事後的:".$decrypted.PHP_EOL;

保存爲test.php運行一下,以下圖所示:

而後咱們將上面代碼反覆運行100,000次,看看耗費多長時間,這裏只貼關鍵部分代碼:

<?php
require 'RSA.php';
$rsa       = new RSA( $publicKey, $privateKey );
$data      = '你好,古德里安,我是希特勒,你趕忙給我滾回來...';
$start = microtime( true );
for( $i = 1; $i <= 100000; $i++ ) {
  $encrypted = $rsa->encrypt( $data );
  $decrypted = $rsa->decrypt( $encrypted );
}
$end = microtime( true );
echo "一共耗時:".( $end - $start ).PHP_EOL;

而後,運行結果以下圖所示(實際上因爲等待時間太長了,我索性去刷牙洗臉了):

不用驚訝,鈦合金狗眼是否已被亮瞎?瞎也沒用,這是真的,代碼也沒有問題,就是要這麼長時間,沒有辦法。

那麼問題來了,挖掘機學... ...對稱加密不安全,非對稱加密要人命,有沒有什麼好的辦法?

廢話,固然有... ...

最近開了一個微信公衆號,全部文章都先發這裏

圖片描述

相關文章
相關標籤/搜索