百木园-与人分享,
就是让自己快乐。

一种安全加密文件的方式,文件可以实现自校验,防止文件损坏和篡改

项目地址

这个项目是很久以前的,当时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
}

.qm_point{color:#6DA47D;font-size:18px}.qm_a{color:#0000FF}
作者:janbar
出处:https://www.cnblogs.com/janbar
本文版权归作者和博客园所有,欢迎转载,转载请标明出处。喜欢我的文章请 [关注我] 吧。
如果您觉得本篇博文对您有所收获,可点击 [推荐] [收藏] ,或到右侧 [打赏] 里请我喝杯咖啡,非常感谢。


来源:https://www.cnblogs.com/janbar/p/16994689.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 一种安全加密文件的方式,文件可以实现自校验,防止文件损坏和篡改

相关推荐

  • 暂无文章