鍵の長さを減らし、衝突を回避し、鍵がランダムであることを確認して有効な鍵を推測できないようにする安全な方法はありますか?
理論的には、はい。 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問題のビットです。そのままの状態で鍵を保管し、危険なことはしないでください。
実際の問題は、バウチャーコードを表す一意の文字列を取得する方法です。 –
この特定の使用例では、yesです。しかし、私はこの一般的なものを作る方法を知りたいと思っています。例えば、次の時にセキュリティで保護された20文字の文字列を作ります。defuse/php-encryptionはうまく構築されているようです。しかし、生成された鍵の長さを選択できないのは少し悲しいことです。 (または私が何かを逃した) – inquam
彼らは彼らのコードを得た。あなたがしているのは、暗号化された乱数生成器 'random_bytes'です(私はPHP 7がそのコアで機能すると思います)。任意の長さのランダムなバイトを取得したら、それをデータベースに挿入します。その値を 'unique'にして、挿入が失敗した場合(重複のため)、再度ランダム化して、再度挿入し直してください。ランダムな文字に暗号ツールを使用しないでください。 –