J'ai besoin de crypter / décrypter des données avec PHP. Je suis complètement nouveau dans ce domaine, mais j'ai lu que Libsodium-PHP est le meilleur outil de cryptage AES. Tout comme les autres bibliothèques de cryptage PHP que j'ai recherchées, Libsoduim-PHP ne semblait offrir presque aucune documentation sur la façon d'utiliser la bibliothèque (que j'ai pu trouver). Quelqu'un qui a de l'expérience avec le cryptage PHP peut-il me diriger vers une bonne ressource d'apprentissage ou écrire quelques lignes d'exemple de code en utilisant Libsoduim-PHP?
Merci beaucoup pour l'aide,
Atlas

8
atlas81887 27 déc. 2015 à 07:42

2 réponses

Meilleure réponse

Tout comme les autres bibliothèques de cryptage PHP que j'ai recherchées, Libsoduim-PHP ne semblait offrir presque aucune documentation sur la façon d'utiliser la bibliothèque (que j'ai pu trouver).

Depuis la page libsodium-php Github, vous trouverez un lien direct vers un livre en ligne gratuit qui couvre tout ce que vous devez savoir pour démarrer avec libsodium.

Le dernier chapitre contient des recettes libsodium, mais chaque chapitre contient une utilisation détaillée information.

Si vous avez spécifiquement besoin d'AES, lisez ceci .

Si vous n'avez pas d'exigence "AES-or-bust" au-dessus de votre tête, où le fait de ne pas utiliser spécifiquement AES signifie que votre service est renvoyé et que vos développeurs sont confrontés à un peloton d'exécution, vous devriez envisager d'utiliser simplement crypto_secretbox qui utilise Xsalsa20 pour le cryptage et attache une balise d'authentification Poly1305. (Il s'agit du chiffrement authentifié, que vous souhaitez utiliser presque toujours.)

Regardez également Halite si vous voulez un mode simplifié.

15
Scott Arciszewski 27 déc. 2015 à 05:17

Version PHP> = 7.2

Si vous utilisez PHP> = 7.2, utilisez plutôt l'extension de noyau de sodium intégrée.

Exemple d'implémentation

<?php 
//Simple Usage

/**
* Encrypt a message
* 
* @param string $message - message to encrypt
* @param string $key - encryption key
* @return string
*/
function safeEncrypt($message, $key)
{
    $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
*/
function safeDecrypt($encrypted, $key)
{   
    $decoded = base64_decode($encrypted);
    if ($decoded === false) {
        throw new Exception('Scream bloody murder, the encoding failed');
    }
    if (mb_strlen($decoded, '8bit') < (SODIUM_CRYPTO_SECRETBOX_NONCEBYTES + SODIUM_CRYPTO_SECRETBOX_MACBYTES)) {
        throw new Exception('Scream bloody murder, the message was truncated');
    }
    $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 ($plain === false) {
         throw new Exception('the message was tampered with in transit');
    }
    sodium_memzero($ciphertext);
    sodium_memzero($key);
    return $plain;
}
//Encrypt & Decrypt your message
$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);

$enc = safeEncrypt('Encrypt This String...', $key); //generates random  encrypted string (Base64 related)
echo $enc;
echo '<br>';
$dec = safeDecrypt($enc, $key); //decrypts encoded string generated via safeEncrypt function 
echo $dec;
5
M_R_K 20 févr. 2020 à 04:47