【问题标题】:Encrypt/Decrypt specific data in PHP在 PHP 中加密/解密特定数据
【发布时间】:2019-12-27 13:58:49
【问题描述】:

我是 PHP 新手,我正在为我在大学的一门学科开发一个 Web 应用程序。该网络应用程序包含预订自然活动的平台。 我的问题在于其中一项要求“加密/解密数据”,其中我需要在信用卡数据进入数据库之前对其进行加密。 为简单起见,信用卡字段位于预订表中。 这是我的代码:

$fieldsReservation = array(
    'idUser' => $idUser,
    'idActivity' => $idActivity,
    'reservationDate' => $reservationDate,
    'state' => 'reserved',
    'cardName' => $cardName,
    'cardType' => $cardType,
    'cardNumber' => $cardNumber,
    'cardExpiry' => $cardExpiry,
    'cardCVV' => $cardCVV);

$password = '3sc3RLrpd17';
$method = 'aes-256-cbc';

// password must be exact 32 chars (256 bit)
$password = substr(hash('sha256', $password, true), 0, 32);

// IV must be exact 16 chars (128 bit)
$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);

foreach ($fieldsReservation as $key => $value){
    $fieldsReservation[$key] = base64_encode(openssl_encrypt($value, $method, $password, OPENSSL_RAW_DATA, $iv));
}

我已经尝试过使用foreach,但是使用foreach,所有数据都已加密,我只想加密信用卡数据。 如果有人可以帮助我,我将不胜感激!

【问题讨论】:

  • 很高兴知道一个新人加密信用卡并将它们保存到数据库中,我感谢您提供的解密密钥。你的项目的 URL 又是什么?纯粹出于好奇而询问。
  • 通过重复使用密钥和IV,您可以绝对确定结果并不像应有的那样安全。更重要的是,密码与密钥不同,SHA-256 不是一个好的基于密码的密钥派生函数。因此,即使代码有效,您的代码也不安全,这毕竟是加密的目标。

标签: php encryption aes


【解决方案1】:

您似乎只想加密包含卡相关数据的字段,例如cardNamecardTypecardNumber 等。这样怎么样:

foreach ($fieldsReservation as $key => $value){
  if (substr($key, 0, 4) == "card") {
    $fieldsReservation[$key] = 
      base64_encode(openssl_encrypt($value, $method, $password, OPENSSL_RAW_DATA, $iv));
  }
}

通过查看每个键,代码会检查它是否以“card”开头。如果是这样,它会被加密。

【讨论】:

  • 哦,我从没想过,使用 substr "card",但它是有道理的。非常感谢!!
  • 投了反对票,因为这个答案没有发现安全问题,我不想支持任何包含不安全代码的答案。
【解决方案2】:

创建一个要加密的字段列表,然后循环遍历它。

$to_encrypt = ['cardName', cardNumber'];

foreach ($to_encrypt as $key ){
    $fieldsReservation[$key] = base64_encode(openssl_encrypt($fieldsReservation[$key], $method, $password, OPENSSL_RAW_DATA, $iv));
}

【讨论】:

    【解决方案3】:

    代替

    foreach ($fieldsReservation as $key => $value){
      $fieldsReservation[$key] = base64_encode(openssl_encrypt($value, $method, $password, OPENSSL_RAW_DATA, $iv));
    }
    

    随便用

    $fieldsReservation['cardNumber'] = base64_encode(openssl_encrypt($fieldsReservation['cardNumber'], $method, $password, OPENSSL_RAW_DATA, $iv));
    

    foreach 循环遍历数组的每个元素,因此它应该加密数组的每个元素。如果你想使用数组的一个特定元素,只对数组的那个元素做一些事情。

    【讨论】:

    • 最好是部分回答,所有卡片字段都需要加密。
    猜你喜欢
    • 2012-06-10
    • 2011-11-20
    • 2014-11-21
    • 1970-01-01
    • 2012-08-31
    • 2021-03-11
    • 2012-10-14
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多