ユーザーが提供したパスワードから秘密鍵と公開鍵のペアを取得し、公開鍵を使用して一部のテキスト(長さが1000文字まで)を暗号化して、ペアの秘密鍵。パスワードと秘密鍵はどこにも保存されないため、データベースにアクセスできるユーザーは、ユーザーのパスワードなしではテキストを復号化できません。鍵の生成にはKDFアルゴリズムを使用し、暗号化/復号化には何らかの公開鍵暗号化アルゴリズムを使用する必要があることはわかっています。
安全なアルゴリズムがいくつかあることは知っていますが、クラックされ安全でないと考えられるアルゴリズムもいくつかあります。 KDFと暗号化に使用できる最も安全なアルゴリズムは何ですか?データを可能な限り安全にするには、どのベストプラクティスに従う必要がありますか?
暗号化アルゴリズムのJava標準ライブラリ実装を使用します。
個人的には、公開鍵暗号化が進むにつれて、RSAを使用する必要があると思います。これには複数の理由があります。
RSAは多くの人々によって安全であることが証明されています
RSAは広く使用および実装されているため、情報は広範囲にわたっています
RSAは、十分に大きな鍵を使用する場合、理論的には量子証明です
RSAキーは複数のサイズにすることができます
必要に応じて、楕円曲線暗号を使用することもできます。
KDFが関係しているため、PBKDF2HMACが最もよく使用される標準です。 Argon2、Scrypt、AES-KDFも広く使用されています。
現在、すべてのアプリでPBKDF2HMACを使用していますが、より安全であるため、Scryptに移行しています。
安全なアルゴリズムでパスワードを1回ハッシュするだけです
小さいキーの場合はRSAと同じくらい堅牢である(ECの場合は 256ビット、RSAの場合は3072ビットで同じセキュリティが得られる )ため、計算が高速な楕円曲線を使用してステートメントを作成します。また、素数を見つける必要があるため、RSAキーの要件も異なります。
Curve25519の論文では、秘密鍵を生成するためにこれを持っています:
秘密鍵を計算しています。プログラム内で32バイトのCurve25519秘密鍵を生成するには、まず、暗号的に安全なソース(mysecret [0]、mysecret [1]、...、mysecret [31])から32のランダムなランダムバイトを生成します。次に行う
mysecret [0]&= 248;
mysecret [31]&= 127;
mysecret [31] | = 64;
32バイトのCurve25519秘密鍵mysecret [0]、mysecret [1]、...、mysecret [31]を作成します。
したがって、必要なのは256ビットだけで、数ビットを変更します。 256ビットを取得するには、 Argon2 などのKDFを使用してパスワードをハッシュするだけです。セキュリティ要件に一致するように選択された反復数やその他のパラメーターを選択できるため、ブルートフォースが難しくなります。