1
我使用密鑰組件defuse/php-encryption生成一個用作代金券代碼的安全密鑰。 密鑰具有將生成的密鑰作爲ascii-safe字符串打印的功能。我用例中唯一的問題是它很長。安全地減少化解/ php加密生成密鑰的長度
是否有任何安全的方法來減少密鑰的長度,避免可能的衝突並確保密鑰仍然具有隨機性,因此無法猜測有效的密鑰?
我正在尋找像16個字符鍵的東西。
我使用密鑰組件defuse/php-encryption生成一個用作代金券代碼的安全密鑰。 密鑰具有將生成的密鑰作爲ascii-safe字符串打印的功能。我用例中唯一的問題是它很長。安全地減少化解/ php加密生成密鑰的長度
是否有任何安全的方法來減少密鑰的長度,避免可能的衝突並確保密鑰仍然具有隨機性,因此無法猜測有效的密鑰?
我正在尋找像16個字符鍵的東西。
是否有任何安全的方法來減少密鑰的長度,避免可能的衝突並確保密鑰仍然具有隨機性,因此無法猜測有效的密鑰?
理論上,是的。 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問題。只需按原樣存儲密鑰,不要做任何危險的事情。
所以真正的問題是如何獲得代表優惠券代碼的唯一字符串,對嗎? –
在這個特定的用例是。但是我想知道一種通用的方法,例如下一次可以創建一個安全的20個字符串。defuse/php-encryption似乎已經很好地構建,並且可以信任。但是不能夠選擇任何長度的生成密鑰有點難過。 (或者我錯過了什麼) – inquam
他們得到了正確的代碼。你所追求的是他們的加密安全隨機生成器'random_bytes'(我認爲PHP 7的核心功能就是這個功能)。獲得所需長度的隨機字節後,將其插入數據庫。如果插入失敗(由於重複),使該值爲「唯一」,然後再次隨機化並重新插入。不要對隨機字符使用加密工具。 –