如何使用加密算法保护敏感数据

admin 2024-01-28 61 阅读 0评论

加密是使用算法将明文转换为密文的过程,以防止未经授权的访问。

加密分为两种类型

1、对称密钥加密

2、非对称加密(公钥加密)

加密算法的工作原理

加密算法是一种将明文转换为密文的数学函数,加密算法通常使用密钥来执行加密和解密操作。

1、加密过程

加密过程分为两个步骤:

明文输入:将明文输入到加密算法中。

密文输出:加密算法使用密钥对明文执行一系列复杂的数学运算,并将输出结果作为密文。

密文是加密算法输出的结果,它是用密钥加密后的明文,密文通常是无法直接读取的。

2、解密过程

解密过程与加密过程相反,它分为两个步骤:

密文输入:将密文输入到解密算法中。

明文输出:解密算法使用密钥对密文执行一系列复杂的数学运算,并将输出结果作为明文。

3、安全性

加密算法的安全性取决于密钥的强度,如果密钥足够强,则无法使用暴力破解等方法来破解密文。

4、应用

加密算法广泛应用于各种领域,包括网络安全、数据保护、身份认证等。

对称密钥加密

对称密钥加密是一种使用相同密钥进行加密和解密的数据加密方法。对称密钥加密通常用于大量数据的加密,因为它速度快且效率高。

对称密钥加密有两种主要类型:分组密码流密码

1、分组密码

分组密码使用密钥对固定大小的块(例如,64 或 128 位)中的数据进行加密。分组密码广泛用于各种应用,包括网络安全、数据库加密和文件加密。

常见的分组密码包括:

高级加密标准 (AES):AES 是最常用的分组密码,它支持 128、192 或 256 位的密钥长度。

三重 DES (3DES):3DES 是 DES 的三重迭代版本,它提供了更高的安全性。

国际数据加密算法 (IDEA):IDEA 是一种快速有效的密码,但它已被 AES 取代。

2、流密码

流密码通常在连续流中逐位或逐字节加密数据。流密码通常用于实时应用,例如网络传输和音频/视频加密。

常见的流密码包括:

Rivest 密码 (RC4):RC4 是最常用的流密码,它速度快且效率高。

无线局域网安全 (WEP):WEP 是一种用于无线局域网 (WLAN) 的流密码,但它已被 WPA 和 WPA2 取代。

安全套接字层 (SSL):SSL 是一种用于加密网络通信的协议,它使用流密码来保护数据。

示例:AES(高级加密标准)

function encrypt($data=""$key="") {
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("aes-256-cbc")); // 动态 iv (我们也可以设置静态 iv)
    $encrypted = openssl_encrypt($data"aes-256-cbc"$key, 0, $iv);
    return base64_encode($iv . '!!' . $encrypted);
}
function decrypt( $data=""$key="") {
    list($iv$encryptedData) = explode('!!', base64_decode($data), 2);
    return openssl_decrypt($encryptedData"aes-256-cbc"$key, 0, $iv);
}

$plainData = [
    'email' => 'codewithrubab@gmail.com',
    'password' => 'codeOn@Vscode2024';
];
$saltKey = "asdckd44dbc228e16c2888436d17a";

$encryptedData = encrypt(json_encode($plainData), $saltKey);
echo $encryptedData;
$decryptedData = decrypt($encryptedData$saltKey);
print_r($decryptedData);

注意:如果我们需要在相同的纯文本上重新生成相同的加密数据,那么需要始终使用相同的 Salt Key 和 IV。否则,输出将会不同。

非对称加密(公钥加密):

它使用两种不同的密钥:用于加密的公钥和用于解密的私钥。

我们不用安全密钥交换来加密,因为它比对称加密慢,但对于数字签名和身份验证很有用,

常见的公钥加密技术:RSAECC(椭圆曲线加密)、Diffie-Hellman

下面是一个关于 RSA 算法的示例。

如果我们没有公钥和私钥,可以从命令行界面生成。

对于目录中的私钥文件生成:

openssl genrsa -out privateKey.pem 2048

对于公钥:

openssl rsa -in privateKey.pem -pubout

这里,privateKey.pemprivateKey.pem是生成的文件名。

生成的公钥是 RSA 结果。

私钥不是 RSA 结果,为了使其成为 RSA 结果,还需要编写一些代码。

首先,将此包安装到Laravel项目中。

Composer require "phpseclib/phpseclib""~2.0"
use phpseclib\Crypt\RSA;


// 私钥: pem 转换为 rsa 代码
$privateKey = '置pem文件数据';
$rsa = new RSA();
$rsa->loadKey($privateKey);
$rsaPrivateKey = $rsa->getPrivateKey();
dd($rsaPrivateKey);

此外,如果我们需要将公钥从 pem 转换为 RSA,那么我们可以使用此代码进行转换。

// 公钥: pem 转换为 rsa.
$publicKey = '设置pem文件数据';
$rsa = new RSA();
$rsa->loadKey($publicKey);
$rsa->setPublicKey($publicKey);
$rsaPublicKey = $rsa->getPublicKey();
dd($rsaPublicKey);

让我们看看非对称加密的现实实现:

商家与银行进行交易时,需要使用公钥加密和私钥解密来保护数据的安全。

银行向商家提供公钥,商家将公钥分享给银行。商家使用私钥加密交易请求数据,并将加密的数据发送给银行。银行使用商家提供的公钥解密数据。

银行处理数据后,使用私钥向商家发送加密响应。商家使用银行的公钥解密响应,以获得简单的回复。

此外,银行还要求商家在每个交易请求中发送签名。商家使用私钥和 PKCS1Padding 算法来解密已解码的敏感数据。签名使用 SHA256withRSA 签名算法生成。

现在将进行 api 调用以向银行端发起交易。

public  function signatureGenerate($data){
   $private_key = "-----您的RSA私钥-----";
   openssl_sign(json_encode($data), $signature$private_key, OPENSSL_ALGO_SHA256);
   return base64_encode($signature);
}   


public function encryptDataWithPublicKey($data){
   $public_key = "-----您的公钥-----";
   openssl_public_encrypt(json_encode($data), $encryptedData$public_key, OPENSSL_PKCS1_PADDING);
   return base64_encode($encryptedData);
}


public function decryptDataWithPrivateKey($cryptText){
   $private_key = "-----您的RSA 私钥-----";
   openssl_private_decrypt(base64_decode($cryptText), $plainText$private_key, OPENSSL_PKCS1_PADDING);
   return json_decode($plainTexttrue);
}


public function HttpPostMethod($postURL$postData$authToken = null)
{
   try {
       $curl = curl_init($postURL);
       $postData = json_encode($postData);
       $header = array(
           'Content-Type:application/json'
       );
      
       if($authToken){
           $header[] = 'token:' . $authToken;
       }


       curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
       curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
       curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
       curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
       curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
       curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
       curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);


       $resultdata = curl_exec($curl);


       $err = curl_error($curl);
       $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
       $curlErrorNo = curl_errno($curl);


       $ResultArray = json_decode($resultdatatrue);
       curl_close($curl);
       return $ResultArray;
   } catch (\Exception $exception) {
       echo '无法与银行连接,请稍后再试';
       exit;
   }


}


initTransaction($merchantId$merchantAccountNumber$orderId){
   $postUrl = 'api.your-bank.com/api/payment/initialize';
   $plainData = array(
       'merchant_id' => $merchantId,
       'order_id' => $orderId
   );
   $postData = array(
       'account_number' => $merchantAccountNumber,
       'sensitiveData' => $this->encryptDataWithPublicKey($sensitiveData),
       'signature' => $this->signatureGenerate($sensitiveData)
   );


   return $this->HttpPostMethod($postUrl$postData);
}
$encryptedResponse = $this->initTransaction('MER1234''ACC12345''ORD123456');
$plainResponse = $this->decryptDataWithPrivateKey($encryptedResponse['sensitiveData']);
dd($plainResponse);

选择加密算法时要考虑的事项:

1、需要的安全级别。

2、加密和解密的速度。

3、密钥管理复杂性。

4、资源限制。

使用加密算法的地方

1、安全通信(例如电子邮件、VPN)

2、数据存储(例如数据库、文件系统)

3、金融交易(例如网上银行)

4、密码保护

5、数字签名

发表评论

快捷回复: 表情:
Addoil Applause Badlaugh Bomb Coffee Fabulous Facepalm Feces Frown Heyha Insidious KeepFighting NoProb PigHead Shocked Sinistersmile Slap Social Sweat Tolaugh Watermelon Witty Wow Yeah Yellowdog
提交
评论列表 (有 0 条评论, 61人围观)
0.196548s