带有整数错误的PHP随机_字节
我正在尝试在PHP 7.2.7 for IIS中使用随机字节和钠对字符串进行加密带有整数错误的PHP随机_字节,php,Php,我正在尝试在PHP 7.2.7 for IIS中使用随机字节和钠对字符串进行加密 $nonce = random_bytes('SODIUM_CRYPTO_SECRETBOX_NONCEBYTES'); 及 两者都返回此错误: Uncaught TypeError: random_bytes() expects parameter 1 to be integer 然而,这很好 $key = random_bytes('SODIUM_CRYPTO_SECRETBOX_KEYBYTES');
$nonce = random_bytes('SODIUM_CRYPTO_SECRETBOX_NONCEBYTES');
及
两者都返回此错误:
Uncaught TypeError: random_bytes() expects parameter 1 to be integer
然而,这很好
$key = random_bytes('SODIUM_CRYPTO_SECRETBOX_KEYBYTES');
谷歌似乎让我失望了,我在搜索时没有找到任何帮助。摘录:
钠(和氯化钠)是一个“固执己见”的库:这意味着所使用的算法已经被选中,不能更改。该库使用了一些最健壮的算法,包括(ECC)
并且不用于加密消息,此函数仅生成随机字节码
此示例代码用于使用以下命令生成密钥:
$msg = 'This is a super secret message!';
// Generating an encryption key and a nonce
$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES); // 256 bit
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); // 24 bytes
// Encrypt
$ciphertext = sodium_crypto_secretbox($msg, $nonce, $key);
// Decrypt
$plaintext = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
echo $plaintext === $msg ? 'Success' : 'Error';
看到了吗
Na_CRYPTO_SECRETBOX_NONCEBYTES实际上是一个预定义的常量,即密钥的长度。下面是其他预定义常量。您的第二个实现
如果已安装并正确配置扩展,则应可以正常工作。如果我是你,我会调查的
您可以使用phpinfo()
来检查PHP的配置,以检查是否启用了钠
如果尚未安装,请使用以下方式安装:
sudo pecl install -f libsodium
已更新
这取决于PHP的配置方式。您可能没有正确访问该常量
请运行此脚本,看看它是否有助于解决您的问题。让我知道结果是什么
$extenstion = FALSE;
$constants = FALSE;
echo '<pre>';
if(in_array('libsodium', get_loaded_extensions())){
$extenstion = TRUE;
echo 'Libsodium IS installed.<br>';
}else{
echo 'Libsodium IS NOT installed.<br>';
}
$constantsArray = get_defined_constants(true);
if(isset($constantsArray['libsodium']) && $constantsArray['libsodium']){
$constants = TRUE;
echo 'You HAVE predefined Libsodium constants.<br>';
}else{
echo 'You DO NOT have any predefined Libsodium constants.<br>';
}
if($extenstion === TRUE && $constants === TRUE){
foreach($constantsArray['libsodium'] as $constant=>$value){
if(preg_match('/CRYPTO_SECRETBOX_NONCEBYTES|CRYPTO_SECRETBOX_KEYBYTES/', $constant)){
echo 'Your predefined constant\'s name is set as this: ' . $constant . ' To use in your functions: random_bytes(' . $constant . ');' . '<br>';
}
}
echo 'Here is a full list of your Libsodium constants:<br>';
print_r(get_defined_constants(true)['libsodium']);
}
//***Leave these commented out when you first run the test.***
//To see ALL of your constants uncomment this line:
//print_r(get_defined_constants(true));
//To see ALL of your extensions uncomment this line:
//print_r(get_loaded_extensions());
echo '</pre>';
$extension=FALSE;
$constants=FALSE;
回声';
if(在数组中('libnaude',获取加载的扩展名()){
$extension=TRUE;
echo“已安装LibNade.
”;
}否则{
echo“未安装LibNasdian.
”;
}
$constantsArray=获取定义的常量(true);
if(isset($constantsArray['LibNasdium'])和&$constantsArray['LibNasdium'])){
$constants=TRUE;
echo“您有预定义的LibNa常量。
”;
}否则{
echo“您没有任何预定义的LibNa常量。
”;
}
如果($extension==TRUE&&$constants==TRUE){
foreach($constantsArray['libnaude']作为$constant=>$value){
if(preg_match('/CRYPTO_SECRETBOX_NONCEBYTES | CRYPTO_SECRETBOX_KEYBYTES/',$constant)){
echo“您预定义的常量”的名称设置为:“.$constant.”要在函数中使用:随机字节(“.$constant”);“.
”;
}
}
echo“这是LibNa常量的完整列表:
”;
打印(获取定义的常量(真)['LibNa']);
}
//***当您第一次运行测试时,请将这些注释掉***
//要查看所有常量,请取消对此行的注释:
//打印(获取定义的常量(真));
//要查看所有扩展,请取消对此行的注释:
//打印(获取加载的扩展名());
回声';
已安装钠。这是响应���C���������5.����� E�~Aij�0�_������@Andrew Lindemulder请查看更新的答案。这将让我们了解您当前的设置。让我知道。@Andrew Lindemolder运气好吗?谢谢get_loaded_extensions()
帮助我意识到我甚至没有安装php libnail
,而get_defined_constants()
和get_defined_functions()
帮助我学习正确的语法。
sudo pecl install -f libsodium
$extenstion = FALSE;
$constants = FALSE;
echo '<pre>';
if(in_array('libsodium', get_loaded_extensions())){
$extenstion = TRUE;
echo 'Libsodium IS installed.<br>';
}else{
echo 'Libsodium IS NOT installed.<br>';
}
$constantsArray = get_defined_constants(true);
if(isset($constantsArray['libsodium']) && $constantsArray['libsodium']){
$constants = TRUE;
echo 'You HAVE predefined Libsodium constants.<br>';
}else{
echo 'You DO NOT have any predefined Libsodium constants.<br>';
}
if($extenstion === TRUE && $constants === TRUE){
foreach($constantsArray['libsodium'] as $constant=>$value){
if(preg_match('/CRYPTO_SECRETBOX_NONCEBYTES|CRYPTO_SECRETBOX_KEYBYTES/', $constant)){
echo 'Your predefined constant\'s name is set as this: ' . $constant . ' To use in your functions: random_bytes(' . $constant . ');' . '<br>';
}
}
echo 'Here is a full list of your Libsodium constants:<br>';
print_r(get_defined_constants(true)['libsodium']);
}
//***Leave these commented out when you first run the test.***
//To see ALL of your constants uncomment this line:
//print_r(get_defined_constants(true));
//To see ALL of your extensions uncomment this line:
//print_r(get_loaded_extensions());
echo '</pre>';