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

  1. 懶漢
  2. 入門

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

首先我不懂,其次,反正你們也不懂。

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

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

加密分爲兩大類:

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

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

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

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

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

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

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

但是,有一點是值得說明,那就是無論是對稱加密還是非對稱加密,都頂不住用機器是強行暴力猜解私鑰。一年不行兩年,兩年不行二十年,二十年不行一百年,總是能猜出來的,這是沒有辦法的一件事情。大家可以搜一搜關於768bit RSA被KO的事件,是吧。

下面我們從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;

然後,運行結果如下圖所示(實際上由於等待時間太長了,我索性去刷牙洗臉了):

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

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

廢話,當然有... ...

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

圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章