方案。
,但是,您不应将密钥用作IV,而应为每个加密使用随机IV。 IV不是秘密,通常与密文(iv | ciphertext | Mac)串联(并且也将被大会)。思想上,应应用不同的密钥进行加密和身份验证(请参见HERE
)。
。 JWE生成了一个令牌,该令牌(紧凑序列化)由5个部分组成,这些部分由点:标头(带有有关算法的信息),加密键,IV,Ciphertext和身份验证标签。 由于不应在您的情况下加密密钥,因此要应用direct
jwe。在这种情况下,第二部分是一个空字符串。 JWE有各种库,例如
jwt-framework。直接JWE的示例实现(具有AES-256和GCM):
<?php
require __DIR__ . '/vendor/autoload.php';
use Jose\Component\Core\AlgorithmManager;
use Jose\Component\Encryption\Algorithm\KeyEncryption\Dir;
use Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM;
use Jose\Component\Core\JWK;
use Jose\Component\Encryption\Serializer\CompactSerializer;
use Jose\Component\Encryption\JWEBuilder;
use Jose\Component\Encryption\JWEDecrypter;
$keyEncryptionAlgorithmManager = new AlgorithmManager([
new Dir(),
]);
$contentEncryptionAlgorithmManager = new AlgorithmManager([
new A256GCM(),
]);
$jwk = new JWK([
'kty' => 'oct',
'k' => 'MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDE',
]);
$serializer = new CompactSerializer();
// Encryption
$jweBuilder = new JWEBuilder(
$keyEncryptionAlgorithmManager,
$contentEncryptionAlgorithmManager
);
$payload = "some payload";
$jwe = $jweBuilder
->create()
->withPayload($payload)
->withSharedProtectedHeader([
'alg' => 'dir',
'enc' => 'A256GCM'
])
->addRecipient($jwk)
->build();
$token = $serializer->serialize($jwe, 0);
print("Token: " . $token . PHP_EOL);
// Decryption
$jweDecrypter = new JWEDecrypter(
$keyEncryptionAlgorithmManager,
$contentEncryptionAlgorithmManager
);
$jwe = $serializer->unserialize($token);
$jweDecrypter->decryptUsingKey($jwe, $jwk, 0);
$payload = $jwe->getPayload();
print("Payload: " . $payload . PHP_EOL);
?>
Token: eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..RVoWvebzuMIpcuTq.VfLcctgHZthdvHda.JjGEESVSAcbZxo6IgdK_qw
Payload: some payload
jwe非常强大,支持许多算法,例如除了上面使用的A256GCM外,还使用A128CBC-HS256,它基本上对应于您使用的算法(请参阅
HERE)。