PHP random_bytes具有钠整数错误

时间:2018-12-28 09:19:21

标签: php

我试图在IIS的PHP 7.2.7中使用随机字节和钠对字符串进行加密。

$nonce = random_bytes('SODIUM_CRYPTO_SECRETBOX_NONCEBYTES');

$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

都返回此错误:

Uncaught TypeError: random_bytes() expects parameter 1 to be integer

但这很好用

$key = random_bytes('SODIUM_CRYPTO_SECRETBOX_KEYBYTES');

Google似乎使我失望了,搜索时没有任何帮助。

3 个答案:

答案 0 :(得分:0)

节选this article

  

钠(和NaCl)是一个“经过修饰的”库:这意味着所用的算法已被选择,无法更改。该库使用了一些最可靠的算法,包括Elliptic-curve cryptography(ECC)。

random_bytes()不用于加密消息,此功能仅生成随机字节码。

此示例代码用于使用Sodium生成密钥:

$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';

看到了吗? SODIUM_CRYPTO_SECRETBOX_NONCEBYTES实际上是一个预定义的常数,它是密钥的长度。遵循this document获取其他预定义的常量。

答案 1 :(得分:0)

您的第二次实施

$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);

如果已安装扩展并正确配置,则应该可以使用。如果我是你,我会调查的。

您可以使用phpinfo()检查PHP的配置,以检查钠盐是否已启用。

而且,如果尚未安装,请使用:

sudo pecl install -f libsodium

答案 2 :(得分:0)

已更新

取决于您如何配置PHP。您可能无法正确访问该常数。

请运行此脚本,看看它是否可以解决您的问题。让我知道结果是什么。

    if getattr(sys, 'frozen', False): 
        geckodriver_path = os.path.join(sys._MEIPASS, "geckodriver.exe")
        caps = DesiredCapabilities().FIREFOX
        caps["pageLoadStrategy"] = "none"
        options = Options()
        options.set_headless(True)
        driver= webdriver.Firefox(geckodriver_path,desired_capabilities=caps, options = options)
    else:            
        caps = DesiredCapabilities().FIREFOX
        caps["pageLoadStrategy"] = "none"
        options = Options()
        options.set_headless(True)  
        driver = webdriver.Firefox(desired_capabilities=caps, options = options)