Javaで文字列を暗号化する方法 質問する

Javaで文字列を暗号化する方法 質問する

必要なのは、2D バーコード (PDF-417) に表示される文字列を暗号化して、誰かがスキャンしようとしたときに何も読み取れないようにすることです。

その他の要件:

  • 複雑であってはならない
  • RSA、PKI インフラストラクチャ、キー ペアなどで構成されてはなりません。

詮索好きな人々を排除できるほど単純で、そのデータを入手したい他の企業にとって解読しやすいものでなければなりません。彼らが私たちに電話すると、私たちは彼らに標準を告げるか、解読に使用できる簡単なキーを渡します。

おそらく、これらの企業はさまざまなテクノロジーを使用している可能性があるため、特別なプラットフォームやテクノロジーに縛られない何らかの標準に従うのがよいでしょう。

何を提案しますか?高度なセキュリティ標準をそれほど複雑にせずに実現できるencrypt()Javaクラスはありますか?decrypt()

ベストアンサー1

これはGoogle経由で表示される最初のページであり、すべての実装におけるセキュリティの脆弱性に私はうんざりしているので、他の人のために暗号化に関する情報を追加するためにこれを投稿します。7年間元の投稿から。私は修士号私はコンピューター エンジニアリングの学位を取得し、暗号学の研究と学習に多くの時間を費やしてきました。そこで、インターネットをより安全な場所にするために、私なりの意見を述べたいと思います。

また、多くの実装は特定の状況では安全かもしれませんが、なぜそれらを使用して誤って間違いを犯す可能性があるのか​​に注意してください。特別な理由がない限り、利用可能な最も強力なツールを使用してください。全体として、可能であればライブラリを使用し、細かい詳細には触れないようにすることを強くお勧めします。

2018年4月5日更新:わかりやすくするために一部を書き直し、推奨ライブラリをジャシプトGoogle の新しいライブラリ Tink完全に削除することをお勧めしますジャシプト既存のセットアップから。

序文

以下では、安全な対称暗号の基礎について概説し、標準Javaライブラリを使って自分で暗号を実装するときによく見られる間違いを指摘します。詳細を飛ばしたい場合は、Google の新しいライブラリ Tinkそれをプロジェクトにインポートし、すべての暗号化に AES-GCM モードを使用すると、安全になります。

Java で暗号化する方法の細かい詳細を知りたい場合は、読み進めてください :)

ブロック暗号

まず最初に、対称キー ブロック暗号を選択する必要があります。ブロック暗号は、疑似ランダム性を作成するために使用されるコンピューター機能/プログラムです。疑似ランダム性とは、量子コンピューター以外のコンピューターでは、実際のランダム性との違いを区別できない偽のランダム性です。ブロック暗号は暗号化の構成要素のようなもので、さまざまなモードやスキームと組み合わせて使用​​することで暗号化を作成できます。

現在利用可能なブロック暗号アルゴリズムについては、一度もない繰り返しますが一度もない使用デス決して使わないほうがいいと思います3DESスノーデンのNSA公開でも疑似ランダムに限りなく近いことが確認できた唯一のブロック暗号は256 の. There also exists AES 128; the difference is AES 256 works in 256-bit blocks, while AES 128 works in 128 blocks. All in all, AES 128 is considered secure although some weaknesses have been discovered, but 256 is as solid as it gets.

Fun fact DES was broken by the NSA back when it was initially founded and actually kept a secret for a few years. Although some people still claim 3DES is secure, there are quite a few research papers that have found and analyzed weaknesses in 3DES.

Encryption Modes

Encryption is created when you take a block cipher and use a specific scheme so that the randomness is combined with a key to creating something that is reversible as long as you know the key. This is referred to as an Encryption Mode.

Here is an example of an encryption mode and the simplest mode known as ECB just so you can visually understand what is happening:

ECBモード

The encryption modes you will see most commonly online are the following:

ECB CTR, CBC, GCM

There exist other modes outside of the ones listed and researchers are always working toward new modes to improve existing problems.

Now let's move on to implementations and what is secure. NEVER use ECB this is bad at hiding repeating data as shown by the famous Linux penguin.Linux ペンギンの例

When implementing in Java, note that if you use the following code, ECB mode is set by default:

Cipher cipher = Cipher.getInstance("AES");

... DANGER THIS IS A VULNERABILITY! and unfortunately, this is seen all over StackOverflow and online in tutorials and examples.

Nonces and IVs

In response to the issue found with ECB mode nounces also known as IVs were created. The idea is that we generate a new random variable and attach it to every encryption so that when you encrypt two messages that are the same they come out different. The beauty behind this is that an IV or nonce is public knowledge. That means an attacker can have access to this but as long as they don't have your key, they cant do anything with that knowledge.

Common issues I will see is that people will set the IV as a static value as in the same fixed value in their code. and here is the pitfall to IVs the moment you repeat one you actually compromise the entire security of your encryption.

Generating A Random IV

SecureRandom randomSecureRandom = new SecureRandom();
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);

Note: SHA1 is broken but I couldn't find how to implement SHA256 into this use case properly, so if anyone wants to take a crack at this and update it would be awesome! Also SHA1 attacks still are unconventional as it can take a few years on a huge cluster to crack. Check out details here.

CTR Implementation

No padding is required for CTR mode.

 Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");

CBC Implementation

If you choose to implement CBC Mode do so with PKCS7Padding as follows:

 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

CBC and CTR Vulnerability and Why You Should Use GCM

CBC や CTR などの他のモードも安全ですが、攻撃者が暗号化されたデータを反転し、復号化時に値を変更できるという問題に遭遇します。たとえば、架空の銀行メッセージ「Sell 100」を暗号化するとします。暗号化されたメッセージは「eu23ng」のようになりますが、攻撃者が 1 ビットを「eu53ng」に変更すると、メッセージを復号化すると突然「Sell 900」と表示されます。

これを回避するために、インターネットの大部分は GCM を使用しており、HTTPS が表示される場合は、おそらく GCM が使用されています。GCM は、暗号化されたメッセージにハッシュで署名し、この署名を使用してメッセージが変更されていないことを確認します。

GCMは複雑なので実装は避けた方が良いでしょう。Google の新しいライブラリ Tinkなぜなら、ここでも、誤って IV を繰り返した場合、GCM の場合、キーが危険にさらされることになるからです。これは、究極のセキュリティ上の欠陥です。新しい研究者は、IV を繰り返してもキーが危険にさらされない IV 繰り返し耐性暗号化モードの開発に取り組んでいますが、これはまだ主流になっていません。

GCMを実装したい場合は、ここに素晴らしい GCM 実装へのリンクただし、セキュリティや、適切に実装されているかどうかは保証できませんが、基礎は理解できます。また、GCM ではパディングがないことに注意してください。

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");

キーとパスワード

もう 1 つ非常に重要な注意点は、暗号化に関しては、キーとパスワードは同じものではないということです。暗号化のキーが安全であるとみなされるには、ある程度のエントロピーとランダム性が必要です。そのため、適切な暗号化ライブラリを使用してキーを生成する必要があります。

つまり、ここでは2つの実装が可能です。1つ目は、ランダムキー生成に関するこのStackOverflowスレッドこのソリューションでは、安全な乱数ジェネレータを使用して、使用できるキーを最初から作成します。

安全性の低いもう1つの選択肢は、パスワードなどのユーザー入力を使用することです。前述したように、パスワードには十分なエントロピーがないため、PBKDF2パスワードを強化して強化するアルゴリズムです。私が気に入ったStackOverflowの実装ただし、Google Tink ライブラリにはこれらすべてが組み込まれているため、これを活用する必要があります。

Android 開発者

ここで指摘しておくべき重要な点は、Android コードはリバース エンジニアリング可能であり、ほとんどの場合、Java コードもリバース エンジニアリング可能であるということです。つまり、コード内にパスワードをプレーン テキストで保存すると、ハッカーは簡単にパスワードを取得できます。通常、このようなタイプの暗号化には、非対称暗号化などを使用します。これはこの記事の範囲外なので、ここでは詳しく説明しません。

アン2013年の興味深い記事Android における Crypto 実装の 88% が不適切に行われたと指摘しています。

最終的な考え

もう一度言いますが、暗号用のJavaライブラリを直接実装することは避け、Google ティンク, it will save you the headache as they have really done a good job of implementing all the algorithms properly. And even then make sure you check up on issues brought up on the Tink github, vulnerabilities popup here and there.

If you have any questions or feedback feel free to comment! Security is always changing and you need to do your best to keep up with it :)

おすすめ記事