有,所以我只有字母和數字使用此方法的方法嗎?
這是一個很好的使用base32-encoding的地方。
一個很好的實現這是this library可用。
使用安全的加密方法的一個例子:
<?php
use ParagonIE\ConstantTime\Base32;
class EmailEncryption
{
protected $key;
public function __construct($key)
{
if (mb_strlen($key, '8bit') !== 32) {
throw new Exception('Keys should be 32 bytes generated from /dev/urandom');
}
}
/**
* @param string $sVar
* @return string
*/
public function encryptVar($sVar)
{
$nonce = random_bytes(12);
$tag = '';
$encrypted = openssl_encrypt(
$sVar,
'aes-256-gcm',
$this->key,
OPENSSL_RAW_DATA,
$nonce,
$tag
);
return Base32::encode($tag . $nonce . $encrypted);
}
/**
* @param string $sVar
* @return string
*/
public function decryptVar($sVar)
{
$decoded = Base32::decode($sVar);
$tag = mb_substr($decoded, 0, 16, '8bit');
$nonce = mb_substr($decoded, 16, 12, '8bit');
$ciphertext = mb_substr($decoded, 28, null, '8bit');
$plaintext = openssl_decrypt(
$ciphertext,
'aes-256-gcm',
$this->key,
OPENSSL_RAW_DATA,
$nonce,
$tag
);
if (is_bool($plaintext)) {
throw new Exception('Invalid ciphertext');
}
return $plaintext;
}
}
用法:
$key = random_bytes(32);
$encrypter = new EmailEncryption($key);
$message = 'test123456789';
$ciphertext = $encrypter->encryptVar($message);
var_dump($ciphertext);
$plaintext = $encrypter->decryptVar($ciphertext);
var_dump($plaintext, $message);
注:這需要PHP 7.1+,但給你認證加密。
爲什麼你關心電子郵件地址格式是否有效後,你加密它的第一部分? (它只需要在加密之前和解密後有效,糾正我,如果我錯了) – Rabin
嗨@Rabin,因爲它是一些Web服務中使用的共享數據庫,它是強制性的在他們的分貝,電子郵件格式是尊重和出於道德和法律方面的原因,我不想給客戶真實的電子郵件地址。在一些加密,我有這樣的:「4n095tOA8PpRq5Nw2tIEp8l47m/[email protected]」,這是不是一個有效的電子郵件格式 – Lebach
等什麼呢?數據庫強制在此字段上進行電子郵件驗證?或者你是否通過API進行數據驗證。如果是後者,你可以使用'bin2hex'(代替base64編碼)給你這樣的東西。 'E27D3DE6D380F0FA51AB9370DAD204A7C978EE6FD5471C794912F4663174D517 @ gmail.com' – Rabin