一種安全加密文件的方式,文件可以實現自校驗,防止文件損壞和篡改

来源:https://www.cnblogs.com/janbar/archive/2022/12/20/16994689.html
-Advertisement-
Play Games

項目地址 這個項目是很久以前的,當時go能力有限,寫的不盡人意。剛好最近有加密文件的需求,所以就完善了相關邏輯。 之前的方案還依賴 Seek(offset int64, whence int) (int64, error) ,看了go很多源碼,都說Seek不可靠。所以目前改為純Reader和Writ ...


項目地址

這個項目是很久以前的,當時go能力有限,寫的不盡人意。剛好最近有加密文件的需求,所以就完善了相關邏輯。

之前的方案還依賴 Seek(offset int64, whence int) (int64, error) ,看了go很多源碼,都說Seek不可靠。所以目前改為純ReaderWriter這兩種介面,當然文件的結構也必須改變。

因為自帶hash校驗,因此內容連一個位元組都不能被篡改,安全性很高。而且隨機的aes密碼也是通過rsa進行加密,因此只要妥善保管好rsa的私鑰就能保證萬無一失。

加密後內容結構如下所示:

rsa密文長度 rsa加密aes密碼後的密文 aes加密內容 數據hash值
len(rsa(password)) rsa(password) aesEnc(data) hash(data)

下麵是示例代碼:

package main

import (
	"bytes"
	"crypto/md5"
	"encoding/hex"
	"flag"
	"io"
	"log"
	"os"

	"github.com/jan-bar/EncryptionFile"
)

func main() {
	org := flag.String("f", "", "enc file path")
	flag.Parse()

	src := *org // dst為生成的加密文件,cmp是通過解密dst生成的文件
	dst, cmp := src+".dst", src+".cmp"

	var pri, pub bytes.Buffer // 生成一對公私鑰數據
	err := EncryptionFile.GenRsaKey(2048, &pub, &pri)
	if err != nil {
		log.Fatal(err)
	}

	//goland:noinspection GoUnhandledErrorResult
	enc := func() error {
		fr, err := os.Open(src)
		if err != nil {
			return err
		}
		defer fr.Close()

		fw, err := os.Create(dst)
		if err != nil {
			return err
		}
		defer fw.Close()

		return EncryptionFile.EncData(fr, fw, pub.Bytes(), md5.New())
	}

	if err = enc(); err != nil {
		log.Fatal(err)
	}

	//goland:noinspection GoUnhandledErrorResult
	dec := func() error {
		fr, err := os.Open(dst)
		if err != nil {
			return err
		}
		defer fr.Close()

		fw, err := os.Create(cmp)
		if err != nil {
			return err
		}
		defer fw.Close()

		return EncryptionFile.DecData(fr, fw, pri.Bytes(), md5.New())
	}

	if err = dec(); err != nil {
		log.Fatal(err)
	}

	md5Src, err := md5file(src)
	if err != nil {
		log.Fatal(err)
	}

	md5Org, err := md5file(cmp)
	if err != nil {
		log.Fatal(err)
	}

	if md5Src != md5Org {
		log.Fatalf("src(%s) != org(%s)", md5Src, md5Org)
	}
}

func md5file(s string) (string, error) {
	fr, err := os.Open(s)
	if err != nil {
		return "", err
	}
	//goland:noinspection GoUnhandledErrorResult
	defer fr.Close()

	h := md5.New()
	_, err = io.Copy(h, fr)
	if err != nil {
		return "", err
	}

	return hex.EncodeToString(h.Sum(nil)), nil
}
作者:janbar 出處:https://www.cnblogs.com/janbar 本文版權歸作者和博客園所有,歡迎轉載,轉載請標明出處。喜歡我的文章請 [關註我] 吧。 如果您覺得本篇博文對您有所收穫,可點擊 [推薦] [收藏] ,或到右側 [打賞] 里請我喝杯咖啡,非常感謝。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 家居網購項目實現05 以下皆為部分代碼,詳見 https://github.com/liyuelian/furniture_mall.git 12.功能11-後臺分頁(分頁顯示家居) 12.1需求分析/圖解 管理員進入到家居管理後臺頁面 點擊家居管理,可以按分頁規則顯示家居信息 12.2思路分析 分 ...
  • 1.裝飾器 #裝飾器的官方定義: 裝飾器本質上是一個Python函數(其實就是閉包),它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。裝飾器用於有以下場景,比如:插入日誌、性能測試、事務處理、緩存、許可權校驗等場景。 2.ddt import unittes ...
  • 用xxl-job做後臺任務管理, 主要是快速解決定時任務的HA問題, 項目代碼量不大, 功能精簡, 沒有特殊依賴. 因為產品中用到了這個項目, 上午花了點時間研究了一下運行機制. 把看到的記一下. ...
  • 問題出在 validatorFactory 和 validator 這兩個局部對象的初始化上。尤其是初始化 validatorFactory調用Validation#buildDefaultValidatorFactory, 這個方法內部會涉及到xml文件的讀取和類映射,可見,每次都做這個事情,CP... ...
  • 訂單自動確認或取消設計方案 前不見古人,後不見來者。念天地之悠悠,獨愴然而涕下。 簡介 系統訂單自動確認或取消的設計方案,最常見的一個業務比如N天後自動確認訂單,達到動態修改訂單狀態的目的。大多數項目採用的都是如下兩種方案。 方案1:使用傳統的資料庫如MySQL,通過輪詢來判斷資料庫表中訂單的狀態。 ...
  • ajax補充說明 主要是針對回調函數args接收到的響應數據 request.is_ajax()判斷是不是ajax請求 後端返回的三板斧都會被args接收不再影響整個瀏覽器頁面 選擇使用ajax做前後端交互的時候 後端一般返回的都是字典數據 user_dict = {'code': 10000, ' ...
  • 1.引入openpyxl庫 安裝openpyxl庫:pip install openpyxl 引入openpyxl庫:from openpyxl import load_worbook 2.代碼實現 from openpyxl import load_workbook #打開Excel wb = l ...
  • 在我們描述堆之前,我們首先要明白一個概念,什麼是樹? 樹的概念及結構 1.樹的概念 樹是一種非線性的數據結構,它是由n(n>=0)個有限結點組成一個具有層次關係的集合。把它叫做樹是因為它看起來像一棵倒掛的樹,也就是說它是根在上,而葉在下的。 有一個特殊的結點,稱為根結點,根節點沒有前驅結點。除根節點 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...