我的意思是:
Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)
可能是这样的:
"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
尝试使用crypt_blowfish
,但对我不起作用。
在进一步执行任何操作之前,请先了解加密和身份验证之间的区别,以及为什么您可能需要经过身份验证的加密而不仅仅是加密。
要实现身份验证加密,您需要加密MAC。加密和认证的顺序非常重要!这个问题的现有答案之一犯了这个错误;许多用PHP编写的密码库也是如此。
您应该避免实现自己的加密,而是使用由加密专家编写和审查的安全库。
如果您有PECL访问,请使用libs钠(或sodium_compat,如果您想要不含PECL的libs钠);否则...
请使用defuse/php加密;别用你自己的密码!
上面链接的这两个库使得在您自己的库中实现经过身份验证的加密变得简单而轻松。
如果您还想编写并部署您自己的密码库,那么您必须采取以下步骤,这是与Internet上每一位密码专家的常规智慧背道而驰的。
hash_equals()
发送的MAC进行比较。如果失败,请中止。mb_strlen()
和mb_substr()
,使用“8bit”
字符集模式防止mbstring.func_overload
问题。mcrypt_create_iv()
,请不要使用mcrypt_rand
!
即使你按照这里给出的建议去做,密码学也会出很多问题。总是让加密专家审查您的实现。如果你没有有幸与当地大学的一位密码学学生成为私人朋友,你可以随时尝试密码学堆栈交流论坛寻求建议。
如果您需要对您的实现进行专业分析,您总是可以雇佣一个信誉良好的安全顾问团队来审查您的PHP密码代码(披露:我的雇主)。
不要加密密码。您希望使用以下密码哈希算法之一对它们进行哈希:
切勿使用通用散列函数(MD5、SHA256)进行密码存储。
不加密URL参数。这不是做这项工作的工具。
<?php
declare(strict_types=1);
/**
* Encrypt a message
*
* @param string $message - message to encrypt
* @param string $key - encryption key
* @return string
* @throws RangeException
*/
function safeEncrypt(string $message, string $key): string
{
if (mb_strlen($key, '8bit') !== SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
throw new RangeException('Key is not the correct size (must be 32 bytes).');
}
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$cipher = base64_encode(
$nonce.
sodium_crypto_secretbox(
$message,
$nonce,
$key
)
);
sodium_memzero($message);
sodium_memzero($key);
return $cipher;
}
/**
* Decrypt a message
*
* @param string $encrypted - message encrypted with safeEncrypt()
* @param string $key - encryption key
* @return string
* @throws Exception
*/
function safeDecrypt(string $encrypted, string $key): string
{
$decoded = base64_decode($encrypted);
$nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
$ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');
$plain = sodium_crypto_secretbox_open(
$ciphertext,
$nonce,
$key
);
if (!is_string($plain)) {
throw new Exception('Invalid MAC');
}
sodium_memzero($ciphertext);
sodium_memzero($key);
return $plain;
}
然后测试它:
<?php
// This refers to the previous code block.
require "safeCrypto.php";
// Do this once then store it somehow:
$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);
$message = 'We are all living in a yellow submarine';
$ciphertext = safeEncrypt($message, $key);
$plaintext = safeDecrypt($ciphertext, $key);
var_dump($ciphertext);
var_dump($plaintext);
我一直在做的一个项目是一个名为Halite的加密库,目的是让libs钠变得更容易、更直观。
<?php
use \ParagonIE\Halite\KeyFactory;
use \ParagonIE\Halite\Symmetric\Crypto as SymmetricCrypto;
// Generate a new random symmetric-key encryption key. You're going to want to store this:
$key = new KeyFactory::generateEncryptionKey();
// To save your encryption key:
KeyFactory::save($key, '/path/to/secret.key');
// To load it again:
$loadedkey = KeyFactory::loadEncryptionKey('/path/to/secret.key');
$message = 'We are all living in a yellow submarine';
$ciphertext = SymmetricCrypto::encrypt($message, $key);
$plaintext = SymmetricCrypto::decrypt($ciphertext, $key);
var_dump($ciphertext);
var_dump($plaintext);
所有的底层加密技术都由LibsNazo处理。
<?php
/**
* This requires https://github.com/defuse/php-encryption
* php composer.phar require defuse/php-encryption
*/
use Defuse\Crypto\Crypto;
use Defuse\Crypto\Key;
require "vendor/autoload.php";
// Do this once then store it somehow:
$key = Key::createNewRandomKey();
$message = 'We are all living in a yellow submarine';
$ciphertext = Crypto::encrypt($message, $key);
$plaintext = Crypto::decrypt($ciphertext, $key);
var_dump($ciphertext);
var_dump($plaintext);
注意:crypto::encrypt()
返回十六进制编码的输出。
如果你想要使用“密码”,请立即停止。你需要一个随机的128位加密密钥,而不是人类记忆深刻的密码。
您可以存储加密密钥以供长期使用,如下所示:
$storeMe = bin2hex($key);
并且,根据需要,您可以检索它,如下所示:
$key = hex2bin($storeMe);
我强烈建议只存储一个随机生成的密钥以供长期使用,而不是任何类型的密码作为密钥(或派生密钥)。
如果您正在使用Defuse的库:
$string=$keyobject->savetoAsciisafeString()
$loaded=key::loadFromasCiisafeString($string);
这是个坏主意,但好吧,下面是安全的方法。
首先,生成一个随机密钥并将其存储在一个常量中。
/**
* Replace this with your own salt!
* Use bin2hex() then add \x before every 2 hex characters, like so:
*/
define('MY_PBKDF2_SALT', "\x2d\xb7\x68\x1a\x28\x15\xbe\x06\x33\xa0\x7e\x0e\x8f\x79\xd5\xdf");
请注意,您正在增加额外的工作,可以使用这个常数作为关键字,并节省您自己的很多心痛!
/**
* Get an AES key from a static password and a secret salt
*
* @param string $password Your weak password here
* @param int $keysize Number of bytes in encryption key
*/
function getKeyFromPassword($password, $keysize = 16)
{
return hash_pbkdf2(
'sha256',
$password,
MY_PBKDF2_SALT,
100000, // Number of iterations
$keysize,
true
);
}
不要只使用16个字符的密码。你的加密密钥就会被滑稽地破解。
问题内容: 我的意思是: 也许像: 在PHP中,您该怎么做? 尝试使用 ,但对我不起作用。 问题答案: 更新 PHP 7就绪版本。它使用PHP OpenSSL库中的openssl_encrypt函数。
本文向大家介绍php加密解密字符串示例,包括了php加密解密字符串示例的使用技巧和注意事项,需要的朋友参考一下 收录了一些比较经典的PHP加密解密函数代码,分享给大家。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。 希望本文所述对大家PHP程序设计有所帮助。
本文向大家介绍PHP加密解密字符串汇总,包括了PHP加密解密字符串汇总的使用技巧和注意事项,需要的朋友参考一下 项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。 最常见的应用在用户登录以及一些API数据交换的场景。 笔者收录了一些比较经典的PHP加密解密函数代码,分享给大家。加密解密
我感兴趣的是构建一个个人使用的小应用程序,它将使用JavaScript在客户端加密和解密信息。加密的信息将存储在服务器上的数据库中,但不会存储解密的版本。 它不一定要是超级duper安全的,但我想使用一个当前未中断的算法。 理想情况下我可以做一些 生成编码字符串,以及类似于 以后再解码。 到目前为止,我已经看到了以下内容:http://bitwiseshiftleft.github.io/sjcl
本文向大家介绍PHP解密Unicode及Escape加密字符串,包括了PHP解密Unicode及Escape加密字符串的使用技巧和注意事项,需要的朋友参考一下 本文给大家分享一个PHP解密Unicode及Escape加密字符串函数 在网上搜索一把,很多用php实现的escape函数,大同小异 以上所述就是本文的全部内容了,希望大家能够喜欢。
问题内容: 我是密码学的新手。我希望学习如何在文件中加密和解密文本……当我在net中引用相关文章时。我怀疑对同一文本进行多次加密后,单个文本的加密文本是否会相同?谁能解决我的疑问? 问题答案: 这是使用该类的示例: