この記事では、主にJava実装に一般的に使用される暗号化アルゴリズム - 一元配置暗号化アルゴリズムMD5とSHAを紹介します。
1。Javaのセキュリティアーキテクチャ
1.1 Javaのセキュリティアーキテクチャの紹介
Javaのセキュリティフレームワークのクラスとインターフェイスを提供します。 JDKセキュリティAPIは、Java.securityパッケージ(およびそのサブパッケージ)にあるJavaプログラミング言語のコアAPIと、sun.securtyapiパッケージ(およびそのサブパッケージ)にあります。開発者がプログラムで低レベルと高度なセキュリティ機能の両方を使用できるように設計されています。
JDK 1.1のJDKの最初のリリースでは、「Java暗号化アーキテクチャ」(JCA)が導入されました。これは、Javaプラットフォームのパスワード機能にアクセスして開発するために使用されるアーキテクチャを指します。 JDK 1.1では、JCAにはデジタル署名とメッセージダイジェスト用のAPIが含まれています。 JDK 1.2はJava暗号化アーキテクチャを大幅に拡張し、X.509 V3証明書をサポートするために証明書管理インフラストラクチャをアップグレードし、微調整された構成可能で柔軟な、拡張可能なアクセス制御のための新しいJavaセキュリティアーキテクチャを導入します。
Java暗号化アーキテクチャには、JDK 1.2セキュリティAPIのパスワード関連部分と、このドキュメントで提供される一連の規則と仕様が含まれています。複数の相互運用可能なパスワードを実装するために、「プロバイダー」アーキテクチャも提供します。
Java Password Extension(JCE))は、暗号化、キー交換、情報認証コード(MAC)のAPIを含むJCA APIを拡張します。 JCEとJDKのパスワードは、プラットフォームに関連しない完全なパスワードAPIを提供します。 JDKとしてのJCEは、米国の輸出管理制約に準拠するために独立してリリースされます。
1.2日食におけるJDKの関連ソースコード
Javaの一方向暗号化アルゴリズムMD5とSHAの実装をより深く理解するために、JDKのソースコードはEclipse IDEの使用に関連付けられます(著者はJDK6.0を使用します)。
JDK6.0のインストールが完了した後、JDKのルートディレクトリにsrc.zipディレクトリがあります(例:c:/java/jdk1.6.0_21など)。このディレクトリは、別のディレクトリに解凍できます(例:D:/Amigo/Study/Technical Essay/201405)。 SRC.ZIPには、すべてのJDKソースコードが含まれているわけではありません。たとえば、Src.ZipにはSunの下のサブパッケージは存在しません(例:Sun.Securityパッケージとこの記事で使用されているサブパッケージは含まれていません)。
これらのサブパッケージをダウンロードするには、OpenJDKのソースコードをダウンロードする必要があります。 OpenJDKはJDKのオープンソースバージョンであり、GPLプロトコルの形式でリリースされています。 JDK7では、OpenJDKがJDK7のバックボーン開発になりました。 Sun JDK7は、OpenJDK7に基づいてリリースされました。元のコードのほとんどは同じであり、元のコードのほんの一部のみが置き換えられました。 JRL(Javaresearch License、Java Researchライセンス契約)を使用して公開されています。
OpenJDKダウンロードアドレス://www.vevb.com/softs/75724.html
ダウンロードした後、解凍されたOpenJDK-6-SRC-B27-26_OCT_2012/JDK/SRC/SHAHR/CLASSESディレクトリのすべてのファイルとフォルダーを、未zip SRCディレクトリにコピーします。
次に、Eclipseで関連するソースコードを構成します。「Windows」 - >「設定」をクリックし、左メニューで「Java」 - >「インストールされたJRE」を選択します。このマシンのJREが構成されている場合、構成する必要はありません。構成されていない場合は、右側の[追加]ボタンをクリックし、ポップアップ「Add JRE」ウィンドウ(例:/java/jdk1.6.0_21)にインストールされたJDK6.0のパスを選択します。 [OK]ボタンをクリックして、JREの設定を完了します。
SET JREを選択し、右側の[編集...]ボタンをクリックし、ポップアップウィンドウのRT.JARパッケージを選択し、[ソースアタッチメント...]ボタンをクリックし、[外部フォルダー...]ボタンをクリックし、ソースコードパスをSRCのパスに向けて、今すぐSRCのパスに向けます(例:/amigo/研究/201405)。以下の図を参照してください。
「OK」ボタンをクリックしてセットアップした後、MD5とSHAの実装を書くときに、MESSAGED GIGESTの関連する方法を呼び出すときに、Debug Mode F5シングルステップデバッグを使用して、主にMD5およびSHAの一方向暗号化アルゴリズムの実装に関与するクラスを表示できます。
1.3 JDKのMD5とSHA暗号化の主なクラス
JDK6.0では、MD5とSHAに密接に関連するいくつかのクラスのクラス図は次のとおりです。
その中でも、「Messagedigestspi」はトップレベルの抽象クラスであり、同じパッケージの下で「Messaged Gigest」と「Digestbase」はサブアブストラクトクラスです。
上記のクラス図では、デリゲートデザインパターンが使用されています。このパターンの原則は、クラスB(ここに代表的な内部クラスです)とクラスA(ここはMESSAGEDGESTSPIクラスです)であり、互いに関係のない2つのクラスです。 Bには、aとまったく同じメソッドと属性があります。 Bの呼び出し方法と属性は、Aで同じ名前のメソッドと属性を呼び出すことです。Bは、Aとそのサブクラスの存在を知る必要はなく、Aとそのサブクラスと直接接続する必要はありません。 Bを介して、Aの機能を直接使用できます。これは、Aのさまざまな機能を使用するだけでなく、Aとそのサブクラスを適切に保護できます。
MD5とSHAの関連コードはすべてMD5やSHAなどのクラスにありますが、顧客向けのMessaged Gigest Abstractクラスは、さまざまな実装クラスに対処する必要はなく、デリゲートクラスを通じてそれらを扱う必要はありません。
2。MD5暗号化
2.1概要
メッセージダイジェストアルゴリズムMD5(中国名はメッセージダイジェストアルゴリズム第5版です)は、メッセージの整合性保護を提供するためにコンピューターセキュリティの分野で広く使用されているハッシュ機能です。このアルゴリズムのファイル番号はRFC 1321です(R.Rivest、MIT Computer Science for Computer ScienceおよびRSA Data Security Inc. 1992年4月)。
MD5のフルネームは、1990年代初頭にMIT LaboratoryのRonald L. RivestおよびRSA Data Security IncのRonald L. Rivestによって開発され、MD2、MD3、MD4によって開発されたメッセージダイジェストアルゴリズム5(情報補償アルゴリズム)です。
MD5は、完全かつ一貫した情報送信を確保するために使用されます。これは、コンピューターで広く使用されているハッシュアルゴリズムの1つです(抽象アルゴリズムとハッシュアルゴリズムとしても翻訳されています)。主流のプログラミング言語は通常、MD5によって実装されます。データ(漢字など)を別の固定長値に計算することは、ハッシュアルゴリズムの基本原理です。 MD5の前身はMD2、MD3、MD4でした。
MD5の機能は、デジタル署名ソフトウェアを備えた秘密鍵に署名する前に、大容量情報を機密形式に「圧縮」することを許可することです(つまり、任意の長さのバイト文字列を特定の長さの16進列に変換する)。
2.2アルゴリズムの原則
MD5アルゴリズムの簡単な説明は次のとおりです。MD5は、512ビットパケットの入力情報を処理し、各パケットは16の32ビットサブパケットに分割されます。一連の処理の後、アルゴリズムの出力は4つの32ビットパケットで構成されます。これらの4つの32ビットパケットをカスケードした後、128ビットのハッシュ値が生成されます。
MD5アルゴリズムでは、最初に情報を入力する必要があるため、ビット長ペア512の残りのバランスの結果は448に等しくなります。したがって、情報のビット長はN*512+448に拡張され、Nは非陰性整数であり、Nはゼロになります。充填方法は次のとおりです。情報の背後にある1および無数の0を埋め、上記の条件が満たされるまで情報の入力を停止します。次に、64ビットのバイナリで上部充填情報の長さが添付されます。処理のこれら2つのステップの後、情報のビットの長さ= n*512+448+64 =(n+1)*512、つまり、長さはまさに512の整数倍です。その理由は、後続の処理の情報長の要件を満たすことです。
2.3 MD5 Javaの実装
MD5暗号化アルゴリズムのJava実装は次のとおりです。
パッケージamigo.endecrypt; import java.security.messagegest;/*** md5 encryption* @author xingxing、xie* @datetime 2014-5-31*/public class md5util {/**** md5 md5 escryptionは32-bitコードを生成します。 public static string md5encode(string string strow)スロー例外{MessagedGest md5 = null; try {md5 = mesagedigest.getInstance( "md5"); } catch(Exception e){System.out.println(e.toString()); e.printstacktrace();戻る ""; } byte [] bytearray = str.getBytes( "utf-8"); byte [] md5bytes = md5.digest(bytearray); stringbuffer hexvalue = new StringBuffer(); for(int i = 0; i <md5bytes.length; i ++){int val =((int)md5bytes [i])&0xff; if(val <16){hexvalue.append( "0"); } hexvalue.append(integer.tohexstring(val)); } return hexvalue.toString(); } / ** *メイン関数をテスト * @param args * @throws例外 * / public static void main(string args [])throws exception {string str = new String( "amigoxiexiexinginging"); System.out.println( "original:" + str); System.out.println( "md5:" + md5encode(str)); }}テスト結果:
オリジナル:amigoxiexiexingxing
MD5後:E9AC094091B96B84CCA48098BC21B1D6
3。SHA暗号化
3.1概要
SHAはデータ暗号化アルゴリズムです。このアルゴリズムは、長年にわたって暗号化の専門家によって開発および改善されており、ますます完璧になっています。現在、認識されている最も安全なハッシュアルゴリズムの1つになり、広く使用されています。このアルゴリズムのアイデアは、単純なテキストを受信し、それを不可逆的な方法で(通常は小さい)暗号テキストに変換することです。また、入力コードの文字列(PremappsまたはInformation)を使用して、それらをより短い長さの固定桁の出力シーケンス、つまりハッシュ値(情報ダイジェストまたは情報認証コードとも呼ばれる)に変換するプロセスとして簡単に理解することもできます。ハッシュ関数値は、プレーンテキストの一種の「指紋」または「要約」であると言えるため、ハッシュ値のデジタル署名は、プレーンテキストのデジタル署名と見なすことができます。
Secure Hash Algorithm(SHA)は、国立標準技術研究所がリリースしたNational Standard Fips Pub 180です。最新の標準は、2008年にFIPS Pub 180-3に更新されました。その中で、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512などのいくつかの単方向ハッシュアルゴリズムが指定されています。 SHA-1、SHA-224およびSHA-256は、2^64バイナリビット以下のメッセージに適しています。 SHA-384およびSHA-512は、長さが2^128バイナリビット以下のメッセージに適しています。
3.2原則
SHA-1はデータ暗号化アルゴリズムです。このアルゴリズムのアイデアは、単純なテキストを受信し、それを不可逆的な方法で(通常は小さい)暗号テキストに変換することです。また、入力コードの文字列(PremappsまたはInformation)を使用して、それらをより短い長さの固定桁の出力シーケンス、つまりハッシュ値(情報ダイジェストまたは情報認証コードとも呼ばれる)に変換するプロセスとして簡単に理解することもできます。
一方向ハッシュ関数の安全性は、ハッシュ値を生成する動作プロセスの強力な一方向の性質にあります。パスワードが入力シーケンスに埋め込まれている場合、パスワードを知らずに正しいハッシュ値を生成することはできず、セキュリティを確保できます。 SHAは、ブロックあたり512ビット(64バイト)で入力ストリームをブロックし、情報認証コードまたは情報ダイジェストと呼ばれる20バイトの出力を生成します。
このアルゴリズムの入力パケットの長さは無制限であり、生成された出力は160ビットメッセージダイジェストです。入力は512ビットパケットで処理されます。 SHA-1は不可逆的で競合する可能性があり、良好な雪崩効果があります。
デジタル署名は、ハッシュアルゴリズムを介して実装できます。デジタル署名の原則は、関数操作(ハッシュ)を介してメッセージダイジェストに送信されるプレーンテキストを変換することです(異なるプレーンテキストは異なるメッセージダイジェストに対応します)。メッセージダイジェストは暗号化され、プレーンテキストと一緒に受信者に送信されます。受信者は、新しいメッセージダイジェストを生成して、送信者のメッセージダイジェストを比較します。比較結果は一貫しています。つまり、プレーンテキストは変更されていません。一貫性がない場合、それは平易なテキストが改ざんされていることを意味します。
Mac(情報認証コード)はハッシュの結果であり、入力情報の一部はパスワードです。このパスワードを知っている参加者のみが、MACコードの正当性を再度計算して検証できます。
3.3 JavaのSHA実装
SHAのJava実装はMD5に似ており、参照コードは次のとおりです。
パッケージamigo.endecrypt; import java.security.messagegest;/*** shaa encryption* @author xingxing、xie* @datetime 2014-6-1*/public class shautil {/**** sha encryptionは40ビットshaコードを生成します*/パブリックコード* shaencode(string string strows exception {mesagedigest sha = null; try {sha = mesagedigest.getInstance( "sha"); } catch(Exception e){System.out.println(e.toString()); e.printstacktrace();戻る ""; } byte [] bytearray = str.getBytes( "utf-8"); byte [] md5bytes = sha.digest(bytearray); stringbuffer hexvalue = new StringBuffer(); for(int i = 0; i <md5bytes.length; i ++){int val =((int)md5bytes [i])&0xff; if(val <16){hexvalue.append( "0"); } hexvalue.append(integer.tohexstring(val)); } return hexvalue.toString(); } / ** *メイン関数をテスト * @param args * @throws例外 * / public static void main(string args [])throws exception {string str = new String( "amigoxiexiexinginging"); System.out.println( "original:" + str); System.out.println( "sha:" + shaencode(str)); }}テスト結果は次のとおりです。
オリジナル:amigoxiexiexingxing
SHA後:04F79F496DD6BDAB3439511606528A4AD9CAAC5E
3。SHA-1とMD5の比較
両方ともMD4に由来するため、SHA-1とMD5は互いに非常に似ています。それに応じて、それらの強さとその他の特性は似ていますが、次のポイントにも違いがあります。
1)強制攻撃に対するセキュリティ:最も重要で重要な違いは、SHA-1ダイジェストがMD5ダイジェストより32ビット長いことです。強制技術を使用して、そのダイジェストが特定のダイジェストに等しくなるようにメッセージを生成することの難しさは、MD5で2^128の操作であり、SHA-1で2^160の動作です。このようにして、SHA-1は強制的に攻撃に対してより大きな強度を持っています。
2)パスワード分析のセキュリティ:MD5の設計により、パスワード分析に対して脆弱であり、SHA-1はそのような攻撃の影響を受けにくいようです。
3)速度:同じハードウェアでは、SHA-1はMD5よりもゆっくりと実行されます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。