データ暗号化方式は次のとおりです。
一方向暗号化、対称暗号化、非対称暗号化、暗号化ソルト、ハッシュ関数、デジタル署名。
1. 一方向暗号化
一方向暗号化では、データを要約して暗号文が生成され、暗号文は元に戻すことができません。暗号化のみが可能で、復号化はできません。データの完全性を検証するためにデータのフィンガープリント情報を抽出するためによく使用されます。ただし、雪崩効果が発生します (雪崩効果は不安定な平衡状態であり、暗号化アルゴリズムの特徴でもあります。これは、雪崩の前と同様に、テキストまたはキーの小さな変更が暗号文に大きな変更を引き起こすことを示します) , 山はとても穏やかに見えますが、少し問題がある限り大きなクラッシュを引き起こします。多くの場面で使用できます。ハッシュ コードの場合、雪崩効果は、少数のメッセージ ビットで変化することを意味します情報概要の多くの部分が変更されます)。
アルゴリズムはBase64、MD5、SHAを表します。
2. 対称暗号化
対称暗号の暗号化と復号は同じ鍵を使用し、暗号化と復号の速度は比較的速く、効率は比較的高いですが、鍵の送信プロセスは安全ではなく、解読されやすく、鍵の管理も面倒です。
アルゴリズムは、DES、3DES、AES、IDEA、RC4、RC5を表します。
対称暗号化は、シーケンス暗号とブロック暗号の 2 つのカテゴリに分類できます。
2.1. シーケンス暗号
概念的には、ストリーム暗号の演算プロセスは、私たちが想像する暗号化プロセスと一致しています。1 バイトの平文を暗号化アルゴリズムに入力し、1 バイトの暗号文を出力します。反対側では逆の処理が行われます。すべてのデータ処理が完了するまで、プロセス全体が繰り返されます。この考え方は単純であるため、シリアル暗号では同じキーを二度と使用してはなりません。これは、実際の使用では、攻撃者は特定の領域の平文を知っているか、予測できるためです (暗号化された HTTP リクエストのシナリオを考慮してください。多くのリクエストは同じリクエスト メソッド、プロトコル バージョン、リクエスト ヘッダー名を持っています)。観察すると、キー シーケンスの一部を解決できます。同じ鍵を使用すると、後続の部分暗号文を復号化できます。この問題に対処するために、シリアル暗号は長期キーから派生したワンタイムキーとともに使用されます。
2.2、ブロック暗号
ブロック暗号はデータのブロック全体を一度に暗号化し、最新のブロック暗号は 128 ビット (16 バイト) ブロックを使用する傾向があります。ブロック暗号は変換関数です。入力を受け取り、一見ランダムな出力を生成します。同じキーが使用されている限り、入力のあらゆる組み合わせに対して一意の出力が得られます。
これは、より高度な対称暗号化アルゴリズムとして理解できます。この暗号化アルゴリズムは、128 ビット、192 ビット、256 ビットの暗号化強度を持つ AES 暗号化など、非常に一般的です。AES 暗号化は、今日のシステム ドッキングでは非常に一般的です。
3. 非対称暗号化
対称暗号と比較して、同じ鍵セットを所有する必要がなく、非対称暗号は「情報開示のための鍵交換プロトコル」です。非対称暗号化では、公開キーと秘密キーの 2 組のキーが必要で、公開キーと秘密キーはペアになっており、公開キーを使用してデータが暗号化され、対応する秘密キーのみを復号化できます。2 つのキーは数学的に関連しており、特定のユーザー キーで暗号化された暗号文は、ユーザーの暗号化キーでのみ復号化できます。どちらか一方がわかっていれば、もう一方は計算できません。したがって、一対のキーの一方が公開されても、もう一方のキーの特性が侵害されることはありません。ここで、公開鍵を公開鍵、秘密鍵を秘密鍵と呼ぶ。
アルゴリズムはRSA、DSAの略です。
4. 暗号化されたソルト
暗号化されたソルトもよく聞く概念で、暗号化のために暗号化された文字列と連結するために使用されるランダムな文字列です。ソルティングは主に、暗号化された文字列にセキュリティを提供するために使用されます。ソルトを付加した後に暗号化された文字列があった場合、ハッカーはその暗号化された文字列を何らかの手段で利用し、彼が取得する平文は暗号化する前の文字列ではなく、暗号化前の文字列とソルトを組み合わせた文字列となるといわれています。文字列のセキュリティ。
5. ハッシュ関数
ハッシュ関数も暗号化に不可欠な部分です。ハッシュ関数は、任意の長さの入力を固定長の出力に変換するアルゴリズムです。ハッシュ関数に関して言えば、最も一般的なハッシュ関数である MD5 暗号化を間違いなく思い浮かべるでしょう。ハッシュ関数の特徴:
反イメージ性 (一方向性) ハッシュが与えられると、それを生成したメッセージを見つけたり構築したりすることは計算上不可能です。MD5は単一項目暗号であるため、管理者でもユーザーのパスワードを知ることができない機能を実現するためのパスワード暗号化によく使用されます。
2 番目のプリイメージ耐性 (弱い衝突耐性) メッセージとそのハッシュが与えられた場合、同じハッシュを持つ別のメッセージを見つけることは計算上不可能です。
強力な衝突耐性 計算上、同じハッシュを持つ 2 つのメッセージは見つかりません。
6. デジタル署名
ハッシュ関数を使用してメッセージの整合性を検証する場合、情報のハッシュとデータが別々に送信される場合にのみ可能です。そうでない場合、仲介者はデータを変更する際にハッシュを変更し、検出を回避することができます。デジタル署名は主にデータの信頼性を検証するために行われます。WeChat は対称暗号化を通じて署名を生成し、Alipay は非対称暗号化を通じて署名を生成します。効果はあまり変わりません。身元を証明するのに十分です。
ここでは、署名を暗号化として使用する最初のアルゴリズムである RSA に焦点を当てます。銀行のオンライン決済や電子商取引に使用されます。
RSA は、Rivest、Shamir、Adleman の 3 人の数学者の頭字語です。その数学的原理は、大きな整数の因数分解が非常に難しいという理由で設計されたアルゴリズムです。
RSAアルゴリズムの利点
鍵の受け渡しが不要でセキュリティが向上
電子署名認証が可能
RSA アルゴリズムの欠点
暗号化と復号化の効率は高くなく、一般に少量のデータ (キーなど) の処理にのみ適しており、
小規模なインデックス攻撃に対して脆弱です。
非暗号化アルゴリズムの実装フローチャート:
ここでわかるように、非対称暗号化では 2 つのキー (公開キーと秘密キー) を使用してデータの暗号化と復号化を行います。公開キーは暗号化に使用され、秘密キーは復号化に使用されます。
例をテストするために簡単なログイン関数を作成してみましょう
フロントエンド: ここではjsencrypt.jsが使用されます
コード:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<div>打开控制台查看</div>
</body>
<!--jquery cdn-->
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<!--引入jsencrypt.js cdn-->
<script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
<script type="text/javascript">
var publicKey = '公钥串';
console.log(encrypt(publicKey, 'HelloWord'))
// RSA前端加密
function encrypt(key, oldPwd) {
let encrypt = new JSEncrypt();
encrypt.setPublicKey(key);
let encrypted = encrypt.encrypt(oldPwd);
return encrypted;
}
</script>
</html>
フォーム値を取得し、インターフェースをリクエストします。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form id="doLogin">
<!--用户名-->
<input type="text" name="username" required="" autofocus="">
<!--密码-->
<input type="password" name="password" required="">
<button type="button" id="bt">登录</button>
<a th:href="@{/AddPage}">注册</a>
</form>
</body>
<!--jquery cdn-->
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<!--引入jsencrypt.js cdn-->
<script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
<script type="text/javascript">
var publicKey = '公钥串';
// RSA前端加密
function encrypt(key, oldPwd) {
let encrypt = new JSEncrypt();
encrypt.setPublicKey(key);
let encrypted = encrypt.encrypt(oldPwd);
return encrypted;
}
$("#bt").click(function () {
let data = $("#doLogin").serializeArray();
console.log(data)
var obj = {
}
data.forEach((item) => {
obj[item.name] = item.value
})
console.log(obj)
$.ajax({
url: '/app/v1/checkSign',
type: 'get',
data: getSign(obj),
dataType: 'json',
success: function (res) {
console.log(res)
}
})
})
function getSign(params) {
var signParam = "";
var bandParam = publicKey;
params["signTime"] = (new Date().getTime() / 1000).toFixed(0);
var sign = '';
var newData = Object.keys(params).sort();
for (var i = 0; i < newData.length; i++) {
if (
Object.prototype.toString.call(params[newData[i]]) !==
"[object Array]" &&
Object.prototype.toString.call(params[newData[i]]) !== "[object Object]"
) {
if (newData[i] !== "sign") {
sign += newData[i] + params[newData[i]];
}
}
}
signParam = encrypt(publicKey, sign);
params["sign"] = signParam;
return params;
}
</script>
</html>
ページに非表示フィールドを配置して公開キーを保存することもできます。
<!--也可以页面放置一个隐藏域标签,用于存放公钥-->
<input type="hidden" th:value="${session.publicKey}" id="publicKey">