2017-07-18 42 views
1

我使用密钥组件defuse/php-encryption生成一个用作代金券代码的安全密钥。 密钥具有将生成的密钥作为ascii-safe字符串打印的功能。我用例中唯一的问题是它很长。安全地减少化解/ php加密生成密钥的长度

是否有任何安全的方法来减少密钥的长度,避免可能的冲突并确保密钥仍然具有随机性,因此无法猜测有效的密钥?

我正在寻找像16个字符键的东西。

+0

所以真正的问题是如何获得代表优惠券代码的唯一字符串,对吗? –

+0

在这个特定的用例是。但是我想知道一种通用的方法,例如下一次可以创建一个安全的20个字符串。defuse/php-encryption似乎已经很好地构建,并且可以信任。但是不能够选择任何长度的生成密钥有点难过。 (或者我错过了什么) – inquam

+0

他们得到了正确的代码。你所追求的是他们的加密安全随机生成器'random_bytes'(我认为PHP 7的核心功能就是这个功能)。获得所需长度的随机字节后,将其插入数据库。如果插入失败(由于重复),使该值为“唯一”,然后再次随机化并重新插入。不要对随机字符使用加密工具。 –

回答

0

是否有任何安全的方法来减少密钥的长度,避免可能的冲突并确保密钥仍然具有随机性,因此无法猜测有效的密钥?

理论上,是的。 Since the data is hex-encoded,安全的长度减少是这样的(使用constant-time base64url encoding):

<?php 
use ParagonIE\ConstantTime\Base64UrlSafe; 
use ParagonIE\ConstantTime\Hex; 

/** @var Defuse\Crypto\Key $key */ 

// To save a shorter key: 
$saved = $key->saveToAsciiSafeString(); 
$shortened = Base64UrlSafe::encode(
    Hex::decode($saved) 
); 
var_dump($shortened); 

// To restore the key: 
$lengthened = Hex::encode(
    Base64UrlSafe::decode($shortened) 
); 
$restoredKey = Key::loadFromAsciiSafeString($lengthened); 

然而,这是一个有点XY问题。只需按原样存储密钥,不要做任何危险的事情。