みなさん、こんにちは。今日は、メッセージダイジェストアルゴリズムにSHA(Secure Hash Algorithm)を導入し始めました。前の記事で説明したMD5など、広く使用されている他のハッシュアルゴリズムには、後で特定のセキュリティリスクがあることが判明したため、新しいダイジェストアルゴリズムアルゴリズムが登場しました。SHAアルゴリズムは、米国国家安全保障局(NSA)によって設計され、1993年に米国国立標準技術研究所(NIST)によって公開されました。これは米国政府の標準です。2005年以降、SHAが唯一残っているハッシュアルゴリズム標準になっている可能性があります。
SHAファミリの5つのアルゴリズムは、SHA-1、SHA-224、SHA-256、SHA-384、およびSHA-512です。
SHAアルゴリズムファミリーの歴史
SHA-0
最初に述べられたアルゴリズムは1993年にリリースされ、Secure Hash Standard、FIPS PUB180と呼ばれています。このバージョンはしばしばSHA-0と呼ばれます。セキュリティリスクがあることがすぐに発見されたため、NSAによってすぐに撤回され、1995年にリリースされたFIPS PUB 180-1(一般にSHA-1として知られている)の改訂版に置き換えられました。
SHA-1
SHA-1アルゴリズムとMD5アルゴリズムはどちらもMD4アルゴリズムから派生しているため、それらの機能、欠陥、およびアプリケーションシナリオは基本的に同じです。
2つの違いは、SHA-1アルゴリズムの長さが40ビットの16進数(160ビットのバイナリ)であるのに対し、MD5アルゴリズムは32ビットの16進数(128ビットのバイナリ)であるため、2の160倍は2の128倍のオーダーよりはるかに多いため、SHA-1アルゴリズムはMD5アルゴリズムよりも比較的安全です。
SHA-2
2002年に、NISTはSHA-256、SHA-384、およびSHA-512をリリースしました。これらのアルゴリズムはまとめてSHA-2と呼ばれます。2008年に、SHA-224が追加されました。
SHA-1はあまり安全ではないため、現在のバージョンのSHA-2が主流になっています。SHA-2は、次のサブバージョンを含む一連のSHAアルゴリズムバリアントの総称です。
-
SHA-256:256ビットの情報ダイジェストを生成できます。
-
SHA-224:224ビットのメッセージダイジェストを生成できるSHA-256の「去勢バージョン」。
-
SHA-512:512ビットの情報ダイジェストを生成できます。
-
SHA-384:384ビットのメッセージダイジェストを生成できるSHA-512の「去勢バージョン」。
SHA-3
2012年10月、長年のテストと分析の結果、NISTはSHA-3標準アルゴリズムとしてKeccakアルゴリズムを選択しました。Keccakは優れた暗号化パフォーマンスと復号化防止機能を備えています。SHA3アルゴリズムは、イーサリアムの基本的な暗号化アルゴリズムです。
Keccakアルゴリズム(「ket-chak」と発音)は、Guido Bertoni、Joan Daemen、Michael Peters、およびGiles VanAsscheの作品です。SHA-3の候補は2008年10月に提出されました。
Keccakは、革新的な「スポンジエンジン」を使用して、メッセージテキストをハッシュします。これは高速で、Intel Core2プロセッサでは1バイトあたり平均12.5サイクルです。シンプルなデザインで、ハードウェアの実装に便利です。
SHAアルゴリズムの基本原則
先ほど、SHAアルゴリズムファミリーを簡単に紹介し、次にSHA-1を例として取り上げてその基本原理を分析しました。SHA-1はデータ暗号化アルゴリズムです。このアルゴリズムのアイデアは、平文の一部を受け取り、それを不可逆的な方法で暗号文の一部に変換することです。これは、バイナリコードの文字列を入力することとしても簡単に理解できます。短い長さの固定桁の出力シーケンス、つまりハッシュ値であり、情報ダイジェストまたは情報認証コードのプロセスとしても知られています。
SHA-1アルゴリズムの入力メッセージの最大長は264ビットを超えず、生成される出力は160ビットのメッセージダイジェストです。入力は512ビットグループで処理されます。SHA-1は不可逆的で衝突防止性があり、優れたなだれ効果があります。
一般的に、SHA-1アルゴリズムには次の処理手順が含まれます。
(1)入力情報を処理する
SHA-1アルゴリズムは、指定された情報を処理して対応するダイジェストを取得するため、アルゴリズムの要件に従って最初に情報を処理する必要があります。では、どのように対処するのでしょうか?入力情報は512ビットでグループ化され、入力されます。情報メッセージを記入する方法は?実際、メッセージが入力されて512でグループ化されている場合でも、正確に448ビットが残ります。何を記入する必要がありますか?つまり、メッセージの最後に1を追加してから、長さが512を法とし、結果が448になるまで、多くの0を追加します。ここで不思議に思う人もいるかもしれませんが、なぜ448でなければならないのですか?これは、64ビットのメッセージ長情報が最後に追加され、448 +64が正確に512であるためです。
(2)塗りつぶしの長さ情報
前述のように、情報メッセージは最後に補足されて512ビットでグループ化され、残りの448ビットが残ります。残りの64ビットは、メッセージの長さ情報を入力するために使用されます。現時点では、上記のメッセージの長さが264ビットを超えることはできないことを誰もが理解しているかもしれません。長さの値を入力するときは、最初に下位バイトに注意してください。
(3)情報グループ化処理
ビット数を加算して処理される平文の長さは、正確に512ビットの整数倍であり、512ビットの長さでグループ化すると、一定数の平文グループを取得できます。Y0、Y1、...を使用します。これらの平文グループを表すYN-1。平文のグループ化ごとに、MD5と同じ繰り返し処理を繰り返す必要があります。
(4)キャッシュを初期化する
いわゆる初期化キャッシュは、リンク変数に初期値を割り当てることです。以前にMD5アルゴリズムを実装したとき、ダイジェストは128ビットで、計算単位は32ビットであるため、4つのリンク変数が必要であると述べました。同様に、SHA-1は160ビットのメッセージダイジェストを使用し、計算長として32ビットを使用します。これには、5つのリンク変数が必要です。A、B、C、D、Eとしてマークします。初期割り当ては、A = 0x67452301、B = 0xEFCDAB89、C = 0x98BADCFE、D = 0x10325476、E = 0xC3D2E1F0です。
上記のMD5アルゴリズムを比較すると、最初の4つのリンク変数の初期値は元々相同であるため同じであることがわかります。
(5)計算情報の概要
前の準備の後、次のステップは情報の要約を計算することです。SHA1には4ラウンドの操作があります。各ラウンドは20ステップと合計80ステップで構成されます。最終的な160ビットの情報ダイジェストは5つの32ビットリンク変数に格納されます。
SHAアルゴリズムの比較
さまざまなSHAアルゴリズムのデータ比較を次の表に示します。ここで、長さの単位はすべてビットです。
カテゴリー | SHA-1 | SHA-224 | SHA-256 | SHA-384 | SHA-512 |
---|---|---|---|---|---|
メッセージダイジェストの長さ | 160 | 224 | 256 | 384 | 512 |
メッセージの長さ | <2 ^ 64 | <2 ^ 64 | <2 ^ 64 | <2 ^ 128 | <2 ^ 128 |
パケット長 | 512 | 512 | 512 | 1024 | 1024 |
単語ステップを計算する | 32 | 32 | 32 | 64 | 64 |
計算ステップ数 | 80 | 64 | 64 | 80 | 80 |
上記の表から、SHA-224とSHA-256、SHA-384とSHA-512は、メッセージ長、パケット長、計算ワード長、および計算ステップで一貫していることを見つけるのは難しくありません。一般に、SHA-224はSHA-256の縮小版であり、SHA-384はSHA-512の縮小版であると考えられています。
SHAアルゴリズムの実装
アルゴリズム | 要約の長さ(ビット) | リアライザー |
---|---|---|
SHA-1 | 160 | JDK、バウンシーキャッスル、コモンズコーデック |
SHA-224 | 224 | JDK、バウンシーキャッスル |
SHA-256 | 256 | JDK、バウンシーキャッスル、コモンズコーデック |
SHA-384 | 384 | JDK、バウンシーキャッスル、コモンズコーデック |
SHA-512 | 512 | JDK、バウンシーキャッスル、コモンズコーデック |
JDKのSHAアルゴリズムの実装
上記の紹介から、SHAが複数のアルゴリズムに分割されていることがわかります。上記のアルゴリズムはJDKで実装されています。次の実装は一般的な実装方法です。たとえば、アルゴリズムが対応するアルゴリズム名で渡されると、対応するアルゴリズムインスタンス「SHA-256」などを取得できます。
// SHA 加密
public static String encodeSha(String data, String algorithm) throws Exception {
MessageDigest sha = MessageDigest.getInstance(algorithm);
byte[] srcBytes = data.getBytes();
// 使用srcBytes更新摘要
sha.update(srcBytes);
// 完成哈希计算,得到result
byte[] resultBytes = sha.digest();
// 返回十六进制字符串
return new HexBinaryAdapter().marshal(resultBytes);
}
バウンシーキャッスルのSHAアルゴリズムの実装
サードパーティの暗号化コンポーネントパッケージであるBouncyCastleは、JDKを補完するものであり、すべてのSHAアルゴリズムも実装しています。アルゴリズムの一般的な実装は次のとおりです。
public static String encodeSha(String data, String algorithm) throws NoSuchAlgorithmException {
// 加入BouncyCastleProvider支持
Security.addProvider(new BouncyCastleProvider());
// 初始化MessageDigest
MessageDigest sha = MessageDigest.getInstance(algorithm);
// 获取消息摘要
byte[] bytes = sha.digest(data.getBytes());
// 返回十六进制字符串
return Hex.toHexString(bytes);
}
CommonsCodecのSHAアルゴリズムの実装
Commons Codecは、SHAシリーズのアルゴリズムのメッセージダイジェストアルゴリズムの実現を提供します。これは、使用時にカプセル化されたツールクラス-DigestUtilsクラスによって操作できます。DigestUtilsクラスは、Sunが提供するMessageDigestクラスのパッケージであり、完全な実装メソッドを提供します。以下は、SHA-256アルゴリズムの実装例です。
public static String encodeSha1Hex(String data) {
return DigestUtils.sha1Hex(data);
}
public static String encodeSha256Hex(String data) {
return DigestUtils.sha256Hex(data);
}
public static String encodeSha384Hex(String data) {
return DigestUtils.sha384Hex(data);
}
public static String encodeSha512Hex(String data) {
return DigestUtils.sha512Hex(data);
}
完全なコードを表示するには、次のサイトにアクセスしてください。
https://github.com/ForTheDevelopers/JavaSecurity
アプリケーションシナリオ
文書の検証
多くのソフトウェア、特にセキュリティ要件の高いソフトウェアは、公式WebサイトでソフトウェアのSHA値を公開します。ソフトウェアをダウンロードした後、ユーザーはソフトウェアのSHA値を自分で計算し、公開されているSHA値と比較できます。公式サイトでソフトウェアが改ざんされていないか確認してください。ただし、MD5の役割は前回の紹介と同じです。同様に、オラクルの公式Webサイトでも、ダイジェスト値の2つのバージョン、MD5とSHA-256が提供されています。どちらのアルゴリズムを使用しても、ファイルの整合性を検証できます。
パスワードベースの暗号化
SHAはパスワードベースの暗号化(PBE)にも使用されます。PBEの原則は、パスワードとソルト(ソルト)を混合してSHA値を計算し、このハッシュ値を暗号化キーとして使用することです。PBEは、パスワードに対する辞書攻撃を防ぐことができます。
メッセージ認証コード
メッセージ認証コードは、「送信者と受信者の共有秘密鍵」と「メッセージ」を組み合わせて計算したSHAです。メッセージ認証コードを使用して、通信プロセス中のエラー、改ざん、および偽装を検出および防止します。
デジタル署名
デジタル署名は、デジタル世界の現実の社会における署名とシールの実現です。デジタル署名のプロセスは非常に時間がかかるため、通常はメッセージコンテンツ全体には適用されません。代わりに、最初にメッセージコンテンツのSHA値を取得し、SHA値にデジタル署名します。
セキュリティプロトコル
SHAアルゴリズムは、TSL / SSL、PGP、SSH、S / MIME、IPsecなど、多くのセキュリティプロトコルで広く使用されています。同時に、TSL / SSLセキュリティプロトコルのデジタル証明書には、SHAの影もあります。たとえば、証明書の指紋は通常、SHA-1を介して取得されます。
総括する
SHAアルゴリズムは、現在の本番アプリケーションでは比較的一般的です。SHA-256アルゴリズムのセキュリティは、世界中の暗号技術者に広く認識されています。さらに、誰もが私たちの公開アカウントに注意を払い、[暗号化と復号化]に返信することを歓迎します。このシリーズのすべてのソースコードを入手するには。
作成するのは簡単ではありません。この記事が気に入ったら、気に入って転送してください。あなたの注意は、私たちが前進する原動力です_
「私は開発者FTDです」公式アカウント、WeChatアカウント:ForTheDevelopersをフォローしてください。
また、私の個人的なWeChatエクスチェンジであるWeChat ID:ForTheDeveloperを追加してください。
開発に注意を払い、開発者にもっと注意を払ってください!