99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

數(shù)據(jù)安全:數(shù)據(jù)對稱加密方案

2018-11-21 21:18 更新

1.26.1 對稱加密和非對稱加密

關(guān)于數(shù)據(jù)加密和安全這一塊,只作簡單說明。

首先,對稱加密是指數(shù)據(jù)可以加密成密文也可以解密還原,共用同一個密鑰,而非對稱是則公鑰和私鑰,兩者皆使用可逆加密算法。不可逆加密不存在密鑰,只有salt,用來增加可變性和隨機性,如md5。而在加密里面,又數(shù)塊算法加密的方式最為完善,隨附圖一張:

05152

1.26.2 PHP的mcrypt加密擴展

在PhalApi中,同樣也是使用了mcrypt作為底層的數(shù)據(jù)加密技術(shù)方案。請查看: PHP 手冊 函數(shù)參考 加密擴展

1.26.3 加解密的使用

在單元測試中,我們可以快速找到加密和解密的使用,這里再簡單舉一例:

$mcrypt = new PhalApi_Crypt_Mcrypt('12345678');

$data = 'The Best Day of My Life';
$key = 'phalapi';

$encryptData = $mcrypt->encrypt($data, $key);
var_dump($encryptData);

$decryptData = $mcrypt->decrypt($encryptData, $key);
var_dump($decryptData);

上面將會輸出(有亂碼):

0215

1.26.4 更富彈性和便于存儲的加密方案

上面看到,mcrypt下的加密在兩點不足:

  • 1、有亂碼,不能很好地永久化存儲;
  • 2、只針對文本字符串的加密,不支持數(shù)組等,且無法還原類型;

為此, 我們提供了更富彈性和便于存儲的加密方案,即:序列化 + base64 + mcrypt的多重加密方案。

以下是上面的示例-多重加密版:

$mcrypt = new PhalApi_Crypt_MultiMcrypt('12345678');

$data = 'The Best Day of My Life';
$key = 'phalapi';

$encryptData = $mcrypt->encrypt($data, $key);
var_dump($encryptData);

$decryptData = $mcrypt->decrypt($encryptData, $key);
var_dump($decryptData);

對應(yīng)的輸出(這里使用了文字結(jié)果輸出,是因為沒了亂碼):

string(44) "rmFMdhvszAkHhOdzwt/APBACk/Mn/SqhV1Ahp1xT0Gk="
string(23) "The Best Day of My Life"

1.26.5 RSA的支持與超長字符串的應(yīng)對方案

基于項目有使用RSA進行加密和解密的需求,這里特擴展對RSA的支持。同時針對到RSA對字符串長度的限制,提供了分段處理的方案。RSA加密模塊的靜態(tài)類結(jié)構(gòu)UML如下:
rsa-PhalApi

(1)原生態(tài)的通信加密和解密

此部分只是簡單地封裝了openssl相關(guān)函數(shù)的操作,可以實現(xiàn)與其他語言和客戶端下RSA的加密通信。
唯一需要注意的是,對于 “私鑰加密,公鑰解密”“公鑰加密,私鑰解密” 這兩種情況下key的互換和對應(yīng)問題。不要混淆。

(2)超長字符串的分段處理

這里重點說明一下超長字符串通信加密的問題。
解決方案主要涉及兩點:一是分段的處理,二是中間層轉(zhuǎn)換。分段是指將待加密的字符串分割成允許最大長度117(有用戶反饋說是127)內(nèi)的數(shù)組,再各自處理;中間層轉(zhuǎn)換是為了穩(wěn)定性、通用性和方便落地存儲,使用了json和base64的結(jié)合編碼。

雖然此方案解決了超長字符串的問題,但需要特別指出的是, 不能與其他語言、或者PHP其他框架和客戶端進行原生態(tài)的RSA通信 。
我們突破了長度的限制,但失去了通用性。這里羅列一下各個場景和對應(yīng)的處理方式:

支持:PhalApi項目A <--> PhalApi項目A

支持:PhalApi項目A <--> PhalApi項目B,PhalApi項目C,PhalApi項目D,...

不支持:PhalApi項目 <--> 非PhalApi項目的PHP項目

解決方案:將以下RSA模塊相關(guān)的代碼以包的形式拷貝到需要的PHP項目。

.
├── Crypt
│   └── RSA
│       ├── KeyGenerator.php
│       ├── MultiBase.php
│       ├── MultiPri2Pub.php
│       ├── MultiPub2Pri.php
│       ├── Pri2Pub.php
│       └── Pub2Pri.php
└── Crypt.php

不支持:PhalApi項目 <--> 非PHP語言的項目

解決方案:參考PhalApi對RSA超長字符串的處理,同步實現(xiàn)。

不支持:PhalApi項目 <--> 客戶端(iOS/Android/Windows Phone, etc)

解決方案:參考PhalApi對RSA超長字符串的處理,同步實現(xiàn)。

(3)使用示例:2塊2毛2和故事

這是一個有趣的故事,發(fā)生在我一個很好的朋友身上。

在去年暑假的時候,有位師妹通過幾層關(guān)系找到我朋友,想他幫她支付回家的火車票。本著“調(diào)試”(調(diào)戲)的精神,我朋友爽快地答應(yīng)了并讓她把支付寶帳號發(fā)過來。然后,不一會,我朋友收到了一條有支付寶帳號的短信,立馬打了2.22元過去,并附言: 別問我是誰,請叫我雷鋒! 后來證實師妹沒發(fā)來過短信,原來收到的那條是詐騙的短信。。。。你能想象得到騙子收到這2.22元和看到這條留言時的表情么,哈哈~~

以下測試代碼,以上面故事為背景,并演示了RSA的使用示例:

    public function testDecryptAfterEncrypt()
    {
        $keyG = new PhalApi_Crypt_RSA_KeyGenerator();
        $privkey = $keyG->getPriKey();
        $pubkey = $keyG->getPubKey();

        DI()->crypt = new PhalApi_Crypt_RSA_MultiPri2Pub();

        $data = 'AHA! I have $2.22 dollars!';

        $encryptData = DI()->crypt->encrypt($data, $privkey);

        $decryptData = DI()->crypt->decrypt($encryptData, $pubkey);

        $this->assertEquals($data, $decryptData);
    }

1.26.6 建議

在上面的加密中,接口項目在開發(fā)時,需要自定義兩個值:加密向量和私鑰。

為了提高數(shù)據(jù)加密的安全度,建議:

  • 加密向量項目統(tǒng)一在./Config/app.php中配置;
  • 各模塊業(yè)務(wù)數(shù)據(jù)加密所用的Key則由各業(yè)務(wù)點自定義;

這樣,可以對不同的數(shù)據(jù)使用不同的加密私鑰,即使破解了某一個用戶的數(shù)據(jù),也難以破解其他用戶的。

1.26.7 擴展你的對稱加密

尤其對于加密方案和算法,我們在項目開發(fā)決策時,更應(yīng)該優(yōu)先考慮使用現(xiàn)在行業(yè)內(nèi)成熟公認的加密方案和算法,而不是自己去從頭研發(fā)。

但如果你項目確實有此需要,或者需要在mcrypt的基礎(chǔ)上再作一些變通,也是可以很快地實現(xiàn)和注冊使用。

首先,請先實現(xiàn)下面的加密接口:

// $vim ./PhalApi/PhalApi/Crypt.php

interface PhalApi_Crypt {

    public function encrypt($data, $key);

    public function decrypt($data, $key);
}

然后,重新注冊加密服務(wù)即可。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號