2017-07-18 49 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問題。只需按原樣存儲密鑰,不要做任何危險的事情。