MD5を使用してデータベース内の機密データを暗号化する方法

ここに画像の説明を挿入

1. MD5とは何ですか?

Baidu百科事典の要約:
  広く使用されている暗号化ハッシュ関数であるMD5メッセージダイジェストアルゴリズム(英語:MD5メッセージダイジェストアルゴリズム)は、128ビット(16バイト)のハッシュ値を生成できます。完全で一貫した情報伝達を確保するため。MD5は、米国の暗号学者ロナルドリンリベストによって設計され、MD4アルゴリズムを置き換えるために1992年に公開されました。このアルゴリズムの手順は、RFC 1321標準で規定されています。

2.暗号化されたストレージが必要なのはなぜですか?

ここに栗があります:
  情報セキュリティレベル保護システムの実装以来の中国初の「ペナルティチケット」-CSDN Webサイトのユーザーデータ漏洩事件
  2011年12月21日の朝、ハッカーがインターネット上で開発者テクノロジコミュニティCSDN Webサイトのユーザーデータベースを公開しました。600万を超える登録済みメールアカウントと対応するプレーンテキストパスワードを含みます。

什么是明文密码?

以下は、mongoDBで生成した情報の一部です。ユーザー名に対応するパスワードが直接識別できることを直感的に確認できます。つまり、ここでのパスワードは、ログインプロセス中にユーザーが入力した実際のパスワードです。データベースの最終ストレージには、暗号化操作がありません。まず、プレーンテキストで保存されたデータは、DBAやバックエンドエンジニアなどのユーザーが漏えいしないという前提の下で直感的に識別でき、次に、データ漏えいが発生すると、その結果を想像できます。
クリアテキストパスワード
ここに画像の説明を挿入   ここに画像の説明を挿入

这是当时遭到曝光和外泄的明文注册邮箱账号和密码
ここに画像の説明を挿入

3. MD5暗号化とは何ですか?

Chestnut:このようなパスワードは暗号化されて保存されています。
ここに画像の説明を挿入
ここに画像の説明を挿入 ここに画像の説明を挿入
現時点では、パスワードは通常のパスワード「123456」とは非常に異なっているように見えますが、プレーンテキストのように見えるため、ユーザーはログインする必要があります。そのような無関係な文字列を使用しますか?この質問では、MD5がどのように暗号化されているかをよく見る必要があります。

4. MD5暗号化機能

ここで使用されるMD5暗号化は機能的な暗号化であるため、暗号化の結果はランダムビットなしで毎回同じでなければなりません。
暗号化されたテキストが長いか短いかに関係なく、常に32ビットの混合文字列です
。MD5には逆関数クラックの可能性がありませんつまり、MD5は数学的にクラックできない(逆クラックできない)ことを意味します。

6、コードの実装

サーバーはユーザーのログイン情報を受信します。この情報は、Node.jsを通じて取得して暗号化しました。
まず、ノードはMD5を使用してデータを暗号化します。モジュールをダウンロードせずに、暗号モジュールを直接導入できます。

	let crypot = require("crypto");             // 加密操作模块

モジュールを導入したら、ハッシュを作成し、更新とダイジェストを使用してデータを暗号化します

	let md5 = crypot.createHash("md5");
    let password = md5.update(pwdInit).digest("base64");
    // pwdInit 用户原始登录密码
    // password 加密后的MD5字符串

したがって、ここでデータを暗号化して保存するMD5のアプリケーションは、実際には表面ロジックは非常に単純です。つまり、ユーザーが登録すると、ユーザーのパスワードはMD5によって暗号化され、「pwdInit」によって取得された「パスワード」がデータベースに保存されます(例:123456 => E10ADC3949BA59ABBE56E057F20F883E)。ユーザーの実際のパスワードが直接公開されることはありません。その後、ユーザーがログインすると、ログインするために元のパスワードを入力するだけで済みます。元のログインパスワードは、サーバー側のMD5によって32ビット文字列形式に変換され、対応するユーザー名情報を見つけます。暗号化された32ビット文字列パスワードの場合、それらがすべて同じであれば、ログインが成功したことを意味します。これまでのところ、そのような暗号化されたデータが漏洩したとしても、ハッカーは暗号文の背後にある実際のパスワードを知ることはできません。

案例服务端代码:

	let express = require("express");
	let app = express();
	let crypot = require("crypto");             // 加密操作模块
	let db = require("./Mongo_DIY_modules")      // Mgo 自定义封装模块 
	// 登录页面
	app.use("/", express.static("./public"));
	// 登录路由
	app.get("/checklogin", (req, res) => {
	    let username = req.query.username;
	    let userpwd = req.query.userpwd;	
	    // 根据填写的姓名,去数据库寻找该文档/集合
	    // 如过用户名存在,则读取密码进行比对,判断登录成功或失败
	    db.find({
	        "dbName": "homeDB",                       // 数据库名
	        "collectionName": "loginMD5",           // 集合名
	        "json": {
	            "name":username                     // 查询条件
	        },                             
	        "callback": function(err, result) {     // 查询结果
	            if(result.length == 0){
	                res.send("用户名输入有误");
	            } else {
	                if(result[0].pwd === MD5(userpwd)){		// 比对加密后的32位字符串密码
	                    res.send(result[0].name + " 登录成功!")
	                } else {
	                    res.send("密码错误");
	                }
	            }
	        }
	    });
	});
	// 注册路由	(未作用户名同名判断)
	app.get("/regist", (req, res) => {
	    console.log(req.query);
	    db.insertOne("homeDB", "loginMD5", {
	        "name":req.query.username,
	        "pwd":MD5(req.query.userpwd)
	    }, (err, result) => res.send(result));
	});	
	// 运行服务器
	app.listen(3000);

	function MD5(pwd) {
	    let md5 = crypot.createHash("md5");
	    let password = md5.update(pwd).digest("base64");
    	return password;
    }

7. MD5の復号化

一般的なクラッキングツールは辞書モードです。多数の「クリアテキストパスワード」の対応する辞書をリ​​ストして、クリアコードを見つけます。つまり、文字の完全な組み合わせによって、プレーンテキストと暗号文の対応するクエリデータベースが作成されます。

キャラクターを徹底的に組み合わせる方法とは?
  一般的なオンラインMD5暗号化および復号化Webサイトとその方法を
MD5加密:
ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入
確認できます。長さと複雑さに関係なく、暗号化されたデータを32ビット文字列に暗号化でき、暗号化結果は毎回同じである必要があります(MD5暗号化は関数です)暗号化)

MD5解密:
ここに画像の説明を挿入 ここに画像の説明を挿入
ここに画像の説明を挿入 ここに画像の説明を挿入
オンラインWebサイトの復号化により、通常の数字は簡単に解読され、複雑な文字の組み合わせは解読するのが難しいことがわかります。

したがって、いわゆる徹底的な復号化は、実際にはプレーンテキストの暗号文に対応するクエリデータベースを作成することです。巨大なデータは最初に対応する暗号文に暗号化されて保存されます。MD5暗号文の同様の文字列が表示されたら、辞書ライブラリに移動して同じ暗号文を見つけて見つけると、対応する平文が自然に見つかります。この復号化プロセスは、完全な復号化です。

这是某个在线MD5揭秘网的解密范围
組み合わせ形式:
ここに画像の説明を挿入
暗号文タイプ:
ここに画像の説明を挿入
MD5の復号サイトの復号範囲は依然として非常に広いと言えます。したがって、MD5暗号化を使用する場合は、通常、1層の暗号化のみを使用しないのが最善です。MD5を使用してプレーンテキストの複数の層を暗号化し、他の文字を追加して高度なクラッキング効果を実現できます。たとえば、次のとおりです。

	let crypot = require("crypto");
	// 这是MD5加密的封装方法
	function MD5(pwd) {
	    let md5 = crypot.createHash("md5");
	    let password = md5.update(pwd).digest("base64");	
	    // base64 是网络上最常见的用于传输8Bit字节码的编码方式之一
    	return password;
    }
    
    let pwd = "123321";
    MD5(pwd)			  // 对pwd进行一层加密		yIN7I/+Kqoot3pFUc84JkQ==	可轻易在线解密
    MD5(MD5(pwd))		  // 对pwd进行两层层加密		M9o6WW74mkgDA7Zma5Xc4g==	解密相对耗时
    MD5(MD5(MD5(pwd)))	  // 对pwd进行三层层加密		lVKhRjOEZ45+9MVOXHBfYg==	解密困难
    MD5(pwd + MD5(pwd))	  // 组合自定义字符			B3S+VTISt62HgVFcL8m4Yg=		破解失败
    

8.まとめ

重要なデータをデータベースに保存するときは、プレーンコードを使用して保存しないでくださいMD5の役割は、プレーンコードを逆方向にクラックできない文字列に変換することです。これにより、データベースへの侵入を効果的に防ぎ、機密データが直接漏洩する可能性があります。

元の記事を40件公開 31 獲得 ビュー2766

おすすめ

転載: blog.csdn.net/CodingmanNAN/article/details/104935714