Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有整数错误的PHP随机_字节_Php - Fatal编程技术网

带有整数错误的PHP随机_字节

带有整数错误的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');

我正在尝试在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');
谷歌似乎让我失望了,我在搜索时没有找到任何帮助。

摘录:

钠(和氯化钠)是一个“固执己见”的库:这意味着所使用的算法已经被选中,不能更改。该库使用了一些最健壮的算法,包括(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>';