精华内容
下载资源
问答
  • 内容索引:VC/C++源码,算法相关,OpenSSL...这个工具主要的功能已经实现,而且还可以对大文件进行加密,可能效率上还需进一步完善,因为对大文件加密时,太差劲的电脑会感觉有点卡!另外,它还可以对电影加密,不妨一试。
  • 一个使用Des算法文件进行加密的工具,支持大文件
  • 主要介绍了详解Android使用Socket对大文件进行加密传输,使用Socket进行文件传输过程时,需要先进行加密,有兴趣的可以了解一下。
  • 在实现RSA算法任意文件加解密的过程中,将本地文件读取为字节数组byte[ ]后,如何利用已经生成的BigInteger型公钥public_key,BigInteger型私钥private_key以及BigInteger型模数n进行加解密的操作(加密:例如将1....
  • 使用 encrypt 助手方法像图像这样的小文件进行加密可以很好地工作,但是在此过程中,文件内容需要加载到内存中,这对于大文件来说是个问题。 我已经搜索过用于解决此问题的软件包或解决方案,并遇到了这个 ...

    在 Laravel 项目中,用户可以上传任何大小的文件,出于安全目的,需要对这些文件进行静态加密。

    Laravel 提供 encryption, 但它们主要用于加密值。 使用 encrypt 助手方法对像图像这样的小文件进行加密可以很好地工作,但是在此过程中,文件内容需要加载到内存中,这对于大文件来说是个问题。

     

    我已经搜索过用于解决此问题的软件包或解决方案,并遇到了这个 Stack Overflow 回答和这个 PHP 解决方案,该解决方案基本上是 Stack Overflow 所描述的解决方案的 PHP 实现。

     

    我决定创建一个为 Laravel 设计的扩展包,使用简单,优雅的语法提供简单的文件加密 / 解密功能。

     

    我将其称为 FileVault 包,您可以 GitHub 上查看它。 如果您想跳过本教程,可以直接转到 GitHub 存储库并开始使用此软件包。 该扩展包包括了详细的使用文档。

     

    教程

    在这个教程中,我会详细描述加密大文件需要的所有步骤。

    首先, 使用 Laravel 安装器 创建一个新的 Laravel 项目, 命名为 security-app:

    laravel new security-app

    在撰写本教程时,我正在使用 Laravel v6.5.2。

     

    因为我们已经使用了 Laravel 安装程序,所以我们已经生成了一个应用程序密钥并将其添加到我们的 .env 文件中。 如果您使用其他安装方法,请不要忘记使用以下方法生成新的应用程序密钥:

     

    php artisan key:generate

    因为我们正在使用 Laravel Valet,所以应该已经为我们创建了 security-app.test 域名。 如果使用其他开发环境,则应添加一个本地域名指向新项目。

     

    由于自 Laravel 6 以来前端脚手架已被移至 Laravel UI 中,因此我们将安装 laravel/ui 扩展包。

     

    composer require laravel/ui — dev

    接下来,我们将安装 bootstrap 和 auth 脚手架:

    php artisan ui bootstrap --auth

    并编译所有内容:

    npm install && npm run dev

    我们还需要在 .env 文件中配置数据库访问凭据并运行初始迁移:

    php artisan migrate

    现在,我们可以创建一个新用户并登录查看用户仪表板。

    注意:在本演示中,我们将创建一个基本的上传表单,但是在您的应用程序中,您应该考虑使用更复杂的上传功能,对大文件使用分块上传。

     

    您可以使用一个非常好的扩展包是 pion/laravel-chunk-upload.

     

    Laravel Auth 脚手架为我们创建了一个 /home 路由,一个 HomeController 和一个 home.blade.php 视图文件。

     

    让我们编辑 home.blade.php 文件并添加一个表单和一个上传字段:

     

    <form action="{{ route('uploadFile') }}" method="post" enctype="multipart/form-data" class="my-4">
        @csrf
    
        <div class="form-group">
            <div class="custom-file">
                <input type="file" class="custom-file-input" id="userFile" name="userFile">
                <label class="custom-file-label" for="userFile">Choose a file</label>
            </div>
        </div>
    
        <button type="submit" class="btn btn-primary">Upload</button>
    
        @if (session()->has('message'))
            <div class="alert alert-success mt-3">
                {{ session('message') }}
            </div>
        @endif
    </form>

    然后添加相应的路由:

    Route::post(‘/home’, ‘HomeController@store’)->name(‘uploadFile’);

    在 HomeController 中新增 store 方法。 此方法会将上传的文件存储在具有当前用户 ID 的文件目录中 (storage/app/files/{user-id}) 。

     

    注意:这是不正确的做法,不应在生产环境中使用。 为了使本教程更加小巧,我们使用文件系统来获取用户的文件,但是在生产环境中,需要使用数据库来跟踪每个用户上传的文件。

     

    <?php
       /**
         * Store a user uploaded file
         *
         * @param  \Illuminate\Http\Request $request
         * @return \Illuminate\Http\Response
         */
        public function store(Request $request)
        {
            if ($request->hasFile('userFile') && $request->file('userFile')->isValid()) {
                Storage::putFile('files/' . auth()->user()->id, $request->file('userFile'));
            }
    
            return redirect()->route('home')->with('message', 'Upload complete');
        }
    
    

    到了加密用户上传文件 的阶段。我们将安装 file-vault 扩展包:

    composer require soarecostin/file-vault
    

    该软件包允许访问 FileVault 门面, 其中提供了一些用于加密和解密文件的方法,还提供了一些方法来设置选项,例如为每个文件设置不同的加密密钥,或指定该文件的 Laravel 文件系统磁盘。

     

    我们将使用 FileVault::encrypt($file) 方法来加密用户上传的文件。 此功能将删除原始的未加密文件,并将其替换为具有相同名称和附加 .enc 扩展名的文件。

     

    如果您想使用不同的名称命名文件,则可以将所需的名称作为第二个参数传递给 encrypt 方法。 如果您想保留原始文件,可以使用 encryptCopy 方法。

     

    这就是我们的 store 方法现在的样子:

     

    <?php
        /**
         * Store a user uploaded file
         *
         * @param  \Illuminate\Http\Request $request
         * @return \Illuminate\Http\Response
         */
        public function store(Request $request)
        {
            if ($request->hasFile('userFile') && $request->file('userFile')->isValid()) {
                $filename = Storage::putFile('files/' . auth()->user()->id, $request->file('userFile'));
    
                // Check to see if we have a valid file uploaded
                if ($filename) {
                    FileVault::encrypt($filename);
                }
            }
    
            return redirect()->route('home')->with('message', 'Upload complete');
        }
    
    

    接下来,我们需要查看所有用户上传的文件,还需要一种下载它们的方法。

     

    我们将在 HomeController 中创建一个新的 downloadFile 路由和一个新的 downloadFile 方法:

    Route::get(‘/files/{filename}’, ‘HomeController@downloadFile’)->name(‘downloadFile’);

     

    <?php
        /**
         * Download a file
         *
         * @param  string  $filename
         * @return \Illuminate\Http\Response
         */
        public function downloadFile($filename)
        {
            // Basic validation to check if the file exists and is in the user directory
            if (!Storage::has('files/' . auth()->user()->id . '/' . $filename)) {
                abort(404);
            }
    
            return response()->streamDownload(function () use ($filename) {
                FileVault::streamDecrypt('files/' . auth()->user()->id . '/' . $filename);
            }, Str::replaceLast('.enc', '', $filename));
        }
    
    

    downloadFile 使用 Laravel 原生的 streamDownload response, 接收一个回调.

     

    在回调中,我们正在调用扩展包 FileVault 提供的 streamDecrypt 方法,它将对文件进行解密并将其逐段提供给 streamDownload 方法,从而允许您的用户直接下载解密文件。

    现在,我们需要在上传表单下方显示所有用户的文件。 为此,我们将 $files 变量从 HomeController 的 index 方法发送到 home.blade.php 视图文件,并在上传表格的下面显示用户文件。

    <?php
    
        /**
         * Show the application dashboard.
         *
         * @return \Illuminate\Contracts\Support\Renderable
         */
        public function index()
        {
            $files = Storage::files('files/' . auth()->user()->id);
    
            return view('home', compact('files'));
        }
    
    

    home.blade.php

    <ul class="list-group">
        @forelse ($files as $file)
            <li class="list-group-item">
                <a href="{{ route('downloadFile', basename($file)) }}">
                    {{ basename($file) }}
                </a>
            </li>
        @empty
            <li class="list-group-item">You have no files</li>
        @endforelse
    </ul>
    
    

    就是这样! 我们现在在使用静态加密! 我们创建了供用户上传文件的表单,对这些文件进行加密,并且仅在上传文件的用户要求时才对其解密。

    当然,在生产中,需要采取更多的安全措施,而 FileVault 扩展包旨在这方面为您提供帮助。

    如,您可能希望将用户上传的大文件存储在 Amazon S3 中,该扩展包支持文件加密 / 流解密。

     

    您可能还想为每个用户或每个文件使用不同的加密密钥,这对于 FileVault 扩展包也是可能的。

     

    资源

    • 您可以在 GitHub 中找到在本教程中创建的整个 Laravel 应用.

    更多学习内容请访问:

    腾讯T3-T4标准精品PHP架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)

    以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处

    展开全文
  • 大文件加密(实现在文件流中进行加密解密的方法) 一般小的文件可以使用这样的加密解密方法(des): 这里是把文件作为byte,全部缓存到内存中,如byte[] filebyte = getBytesFromFile(file_in); 在内存中直接...

    大文件加密(实现在文件流中进行加密解密的方法)

    对一般小的文件可以使用这样的加密解密方法(des):
    这里是把文件作为byte,全部缓存到内存中,如byte[] filebyte = getBytesFromFile(file_in);
    在内存中直接用加密类对其进行加密,如CryptoUtils.decrypt(filebyte, newkey);
    可是会产生一个问题,如果要加密的文件很大,比如要加密的文件 1G,而内存只有512M,这样就会使byte很大,导致缓冲区溢出,现在寻求如果对大文件进行加密的方法。
           
     /*
             * 加密文件
             * file1加密后产生file2密文
             * */


            public static boolean enCryptoFile(String file1 ,String file2, String key)
            {
                    //key转为成为bytes
                    byte[] newkey = new byte[8];
                    newkey = key.getBytes();
                    //输入文件转换成为bytes
                    File file_in = new File(file1);
                    byte[] filebyte = getBytesFromFile(file_in);
                    //定义输出文件
                    File file_out = new File(file2);
                    FileOutputStream out = null;
                    try {
                            out = new FileOutputStream(file_out);
                            filebyte = CryptoUtils.encrypt(filebyte, newkey);
                            out.write(filebyte,0,filebyte.length);
                            out.close();
                            return true;
                    }
     catch (Exception e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                            System.out.println("File enCrypto Error!");
                    }

                    return false;
            }

            
            /*
             * 解密文件
             * file1密文解密成file2明文
             * key只能是8个byte
             * */


            public static boolean deCryptoFile(String file1 ,String file2, String key)
            {
                    //key转为成为bytes
                    byte[] newkey = new byte[8];
                    newkey = key.getBytes();
                    //输入文件转换成为bytes
                    File file_in = new File(file1);
                    byte[] filebyte = getBytesFromFile(file_in);
                    //定义输出文件
                    File file_out = new File(file2);
                    FileOutputStream out = null;
                    try {
                            out = new FileOutputStream(file_out);
                            filebyte = CryptoUtils.decrypt(filebyte, newkey);
                            out.write(filebyte,0,filebyte.length);
                            out.close();
                            return true;
                    }
    catch(Exception e)
                    {
                            e.printStackTrace();
                            System.out.println("File deCrypto Error!");
                            return false;
                    }

            }



    解决方法:
    经过研究发现1024个明文经过加密后变成1032个密文,
    这样在进行流解密的时候,就需要读1032个密文,解密成为1024个明文。
           
     /*
             * 加密文件
             * file1加密后产生file2密文
             * */

            public static boolean enoldCrByteFile(String file1 ,String file2, String key)
            {
                    //key转为成为bytes
                    byte[] newkey = new byte[8];
                    newkey = key.getBytes();
                    try{
                    File file_in = new File(file1);
                    File file_out = new File(file2);
                    FileInputStream in = new FileInputStream(file_in);
                    FileOutputStream out =new FileOutputStream(file_out);
                    byte[] bytes = new byte[1024];
                    //String end = "<!~!>";
                    //System.out.print(end);
                    //byte [] bend = end.getBytes();
                    while((in.read(bytes))!=-1)
                    {
                            byte[] bout = CryptoUtils.encrypt(bytes, newkey);
                            System.out.println(bytes.length);
                            System.out.println(bout.length);
                            out.write(bout,0,1032);
                            //out.write(bend,0,bend.length);
                    }

                    in.close();
                    out.close();
                    return true;
                    }
    catch(Exception e)
                    {
                            e.printStackTrace();
                            System.out.println("File enCrypto Error!");
                            return false;
                    }

            }

            

            /*
             * 解密文件
             * file1密文解密成file2明文
             * key只能是8个byte
             * */

            public static boolean deoldCrByteFile(String file1 ,String file2, String key)
            {
                    //key转为成为bytes
                    byte[] newkey = new byte[8];
                    newkey = key.getBytes();
                    try{
                    File file_in = new File(file1);
                    File file_out = new File(file2);
                    FileInputStream in = new FileInputStream(file_in);
                    FileOutputStream out =new FileOutputStream(file_out);
                    byte[] bytes = new byte[1032];
                    //String end = "<!~!>";
                    //System.out.print(end);
                    //byte [] bend = end.getBytes();
                    while((in.read(bytes))!=-1)
                    {
                            byte[] bout = CryptoUtils.decrypt(bytes, newkey);
                            out.write(bout,0,bout.length);
                            //out.write(bend,0,bend.length);
                    }

                    in.close();
                    out.close();
                    return true;
                    }
    catch(Exception e)
                    {
                            e.printStackTrace();
                            System.out.println("File deCrypto Error!");
                            return false;
                    }

            }



    重构成这样,减少大对象创建。
    此方法是对文件流进行了byte切割,对流中的byte进行加密。加密后的byte保存到文件中。在解密的时候同样进行分割文件byte流(这里的分割要与加密产生密文byte长度相同),这样就可以实现占用内存少且快速高效的加密方法了。

     /*
             * 加密文件
             * file1加密后产生file2密文
             * */

            public static boolean enCrByteFile(String file1 ,String file2, String key)
            {        
                    Date date = new Date(); //程序开始 时间
                    String dateStr1 = new Timestamp(date.getTime()).toString();
                    System.out.println("加密开始time=" + dateStr1);

                    //key转为成为bytes
                    byte[] newkey = new byte[8];
                    newkey = key.getBytes();
                    
            // 初始化一个用于des初始化的iv常量, 象形加密编码的要求
            IvParameterSpec iv = new IvParameterSpec(new byte[] { 0x12, 0x34, 0x56,
                            0x78, (byte) 0x90, (byte) 0xAB, (byte) 0xCD,
                            (byte) 0xEF }
    );
                    
            DESKeySpec dks = null;
                    try {
                            dks = new DESKeySpec(newkey);
                    }
     catch (InvalidKeyException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }


            SecretKeyFactory keyFactory = null;
                    try {
                            keyFactory = SecretKeyFactory.getInstance(CIPHER_DES);
                    }
     catch (NoSuchAlgorithmException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }

            SecretKey secureKey = null;
                    try {
                            secureKey = keyFactory.generateSecret(dks);
                    }
     catch (InvalidKeySpecException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }


            Cipher cipher = null;
                    try {
                            cipher = Cipher.getInstance(CIPHER_DES_CBC);
                    }
     catch (NoSuchAlgorithmException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }
     catch (NoSuchPaddingException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }


            try {
                            cipher.init(Cipher.ENCRYPT_MODE, secureKey, iv);
                    }
     catch (InvalidKeyException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }
     catch (InvalidAlgorithmParameterException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }


            //return cipher.doFinal(src);
            

                    try{
                    File file_in = new File(file1);
                    File file_out = new File(file2);
                    FileInputStream in = new FileInputStream(file_in);
                    FileOutputStream out =new FileOutputStream(file_out);
                    byte[] bytes = new byte[1024];
                    //String end = "<!~!>";
                    //System.out.print(end);
                    //byte [] bend = end.getBytes();
                    while((in.read(bytes))!=-1)
                    {
                            //byte[] bout = CryptoUtils.encrypt(bytes, newkey);
                            byte[] bout = cipher.doFinal(bytes);//
                            //System.out.println(bytes.length);
                            //System.out.println(bout.length);
                            out.write(bout,0,1032);
                            //out.write(bend,0,bend.length);
                    }

                    in.close();
                    out.close();
                    return true;
                    }
    catch(Exception e)
                    {
                            e.printStackTrace();
                            System.out.println("File enCrypto Error!");
                            return false;
                    }

        }

            

            /*
             * 解密文件
             * file1密文解密成file2明文
             * key只能是8个byte
             * */

            public static boolean deCrByteFile(String file1 ,String file2, String key)
            {
                    //key转为成为bytes
                    byte[] newkey = new byte[8];
                    newkey = key.getBytes();
                    
                    
            // 初始化一个用于des初始化的iv常量, 象形加密编码的要求
            IvParameterSpec iv = new IvParameterSpec(new byte[] { 0x12, 0x34, 0x56,
                            0x78, (byte) 0x90, (byte) 0xAB, (byte) 0xCD,
                            (byte) 0xEF }
    );
                    
            DESKeySpec dks = null;
                    try {
                            dks = new DESKeySpec(newkey);
                    }
     catch (InvalidKeyException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }


            SecretKeyFactory keyFactory = null;
                    try {
                            keyFactory = SecretKeyFactory.getInstance(CIPHER_DES);
                    }
     catch (NoSuchAlgorithmException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }

            SecretKey secureKey = null;
                    try {
                            secureKey = keyFactory.generateSecret(dks);
                    }
     catch (InvalidKeySpecException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }


            Cipher cipher = null;
                    try {
                            cipher = Cipher.getInstance(CIPHER_DES_CBC);
                    }
     catch (NoSuchAlgorithmException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }
     catch (NoSuchPaddingException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }

            try {
                            cipher.init(Cipher.ENCRYPT_MODE, secureKey, iv);
                    }
     catch (InvalidKeyException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }
     catch (InvalidAlgorithmParameterException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                    }

                    
                    try{
                    File file_in = new File(file1);
                    File file_out = new File(file2);
                    FileInputStream in = new FileInputStream(file_in);
                    FileOutputStream out =new FileOutputStream(file_out);
                    byte[] bytes = new byte[1032];
                    //String end = "<!~!>";
                    //System.out.print(end);
                    //byte [] bend = end.getBytes();
                    while((in.read(bytes))!=-1)
                    {
                            byte[] bout = CryptoUtils.decrypt(bytes, newkey);
                            out.write(bout,0,bout.length);
                            //out.write(bend,0,bend.length);
                    }

                    in.close();
                    out.close();
                    return true;
                    }
    catch(Exception e)
                    {
                            e.printStackTrace();
                            System.out.println("File deCrypto Error!");
                            return false;
                    }

            }

           
    环境pc、p3.0G、1G内存
    测试加密效率,对一个434M的文件进行加密,用时2分06秒,内存占用不超过20M(实际上就18M多一点),cpu占用率约为60%,感觉在加密过程中机器反应迟钝。
    感觉这个效率还不错,并没有比全部缓存到内存中慢,但是占用内存却很少。推荐以后使用此方法。

    加密开始time={SysUpTime = 141204 days 10:4:21} {Timestamp = Fri Aug 29 18:36:26 CST 2008}
    加密结束time={SysUpTime = 141204 days 10:25:28} {Timestamp = Fri Aug 29 18:38:32 CST 2008}

    这个效率还不错,不过还有可以提高效率的地方,比如把1024换成des加密的使用的8位倍数的,减少一些最后补齐的加密;把des算法换成RC4等

    原文地址:点击打开链接

    展开全文
  • /// 对文件流进行MD5加密 /// </summary> /// <param name="filePath"></param> /// <returns></returns> /// <example></example> public static string MD5Stream...
    /// <summary>
    /// 对文件流进行MD5加密
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    /// <example></example>
    public static string MD5Stream(string filePath)
    {
        FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
     
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        md5.ComputeHash(fs);
        fs.Close();
     
        byte[] b = md5.Hash;
        md5.Clear();
     
        StringBuilder sb = new StringBuilder(32);
        for (int i = 0; i < b.Length; i++)
        {
            sb.Append(b[i].ToString("X2"));
        }
     
        Console.WriteLine(sb.ToString());
        Console.ReadLine();
     
        return sb.ToString();
    }
     
    /// <summary>
    /// 对文件进行MD5加密
    /// </summary>
    /// <param name="filePath"></param>
    public static void MD5File(string filePath)
    {
        FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
        int bufferSize = 1048576; // 缓冲区大小,1MB
        byte[] buff = new byte[bufferSize];
     
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        md5.Initialize();
     
        long offset = 0;
        while (offset < fs.Length)
        {
            long readSize = bufferSize;
            if (offset + readSize > fs.Length)
            {
                readSize = fs.Length - offset;
            }
     
            fs.Read(buff, 0, Convert.ToInt32(readSize)); // 读取一段数据到缓冲区
     
            if (offset + readSize < fs.Length) // 不是最后一块
            {
                md5.TransformBlock(buff, 0, Convert.ToInt32(readSize), buff, 0);
            }
            else // 最后一块
            {
                md5.TransformFinalBlock(buff, 0, Convert.ToInt32(readSize));
            }
     
            offset += bufferSize;
        }
     
        fs.Close();
        byte[] result = md5.Hash;
        md5.Clear();
     
        StringBuilder sb = new StringBuilder(32);
        for (int i = 0; i < result.Length; i++)
        {
            sb.Append(result[i].ToString("X2"));
        }
     
        Console.WriteLine(sb.ToString());
        Console.ReadLine();
    }

    转载于 https://www.cnblogs.com/ahui/archive/2010/12/23/1914586.html

    展开全文
  • 我将其称为 FileVault 包,您可以 GitHub 上查看它。...在这个教程中,我会详细描述加密大文件需要的所有步骤。 首先, 使用 Laravel 安装器创建一个新的 Laravel 项目, 命名为security-app: 1 l...

    我将其称为 FileVault 包,您可以 GitHub 上查看它。 如果您想跳过本教程,可以直接转到 GitHub 存储库并开始使用此软件包。 该扩展包包括了详细的使用文档。

     

    教程

    在这个教程中,我会详细描述加密大文件需要的所有步骤。

    首先, 使用 Laravel 安装器 创建一个新的 Laravel 项目, 命名为 security-app:

    1

    laravel new security-app

      

     

    因为我们已经使用了 Laravel 安装程序,所以我们已经生成了一个应用程序密钥并将其添加到我们的 .env 文件中。 如果您使用其他安装方法,请不要忘记使用以下方法生成新的应用程序密钥:

     

    1

    php artisan key:generate

      

    因为我们正在使用 Laravel Valet,所以应该已经为我们创建了 security-app.test 域名。 如果使用其他开发环境,则应添加一个本地域名指向新项目。

     

    由于自 Laravel 6 以来前端脚手架已被移至 Laravel UI 中,因此我们将安装 laravel/ui 扩展包。

     

    1

    composer require laravel/ui — dev

      

    接下来,我们将安装 bootstrap 和 auth 脚手架:

    1

    php artisan ui bootstrap --auth

      

    并编译所有内容:


    注意:在本演示中,我们将创建一个基本的上传表单,但是在您的应用程序中,您应该考虑使用更复杂的上传功能,对大文件使用分块上传。现在,我们可以创建一个新用户并登录查看用户仪表板。  

     

    您可以使用一个非常好的扩展包是 pion/laravel-chunk-upload.

     

    Laravel Auth 脚手架为我们创建了一个 /home 路由,一个 HomeController 和一个 home.blade.php 视图文件。

     

    让我们编辑 home.blade.php 文件并添加一个表单和一个上传字段:

     


    然后添加相应的路由:  

    Route::post(‘/home’, ‘HomeController@store’)->name(‘uploadFile’);

    在 HomeController 中新增 store 方法。 此方法会将上传的文件存储在具有当前用户 ID 的文件目录中 (storage/app/files/{user-id}) 。

     

    注意:这是不正确的做法,不应在生产环境中使用。 为了使本教程更加小巧,我们使用文件系统来获取用户的文件,但是在生产环境中,需要使用数据库来跟踪每个用户上传的文件。

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    <?php

       /**

         * Store a user uploaded file

         *

         * @param  \Illuminate\Http\Request $request

         * @return \Illuminate\Http\Response

         */

        public function store(Request $request)

        {

            if ($request->hasFile('userFile') && $request->file('userFile')->isValid()) {

                Storage::putFile('files/' . auth()->user()->id, $request->file('userFile'));

            }

     

            return redirect()->route('home')->with('message''Upload complete');

        }

      

    到了加密用户上传文件 的阶段。我们将安装 file-vault 扩展包:

    composer require soarecostin/file-vault
    

    该软件包允许访问 FileVault 门面, 其中提供了一些用于加密和解密文件的方法,还提供了一些方法来设置选项,例如为每个文件设置不同的加密密钥,或指定该文件的 Laravel 文件系统磁盘。

     

    我们将使用 FileVault::encrypt($file) 方法来加密用户上传的文件。 此功能将删除原始的未加密文件,并将其替换为具有相同名称和附加 .enc 扩展名的文件。

     

    如果您想使用不同的名称命名文件,则可以将所需的名称作为第二个参数传递给 encrypt 方法。 如果您想保留原始文件,可以使用 encryptCopy 方法。

     

    这就是我们的 store 方法现在的样子:

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    <?php

        /**

         * Store a user uploaded file

         *

         * @param  \Illuminate\Http\Request $request

         * @return \Illuminate\Http\Response

         */

        public function store(Request $request)

        {

            if ($request->hasFile('userFile') && $request->file('userFile')->isValid()) {

                $filename = Storage::putFile('files/' . auth()->user()->id, $request->file('userFile'));

     

                // Check to see if we have a valid file uploaded

                if ($filename) {

                    FileVault::encrypt($filename);

                }

            }

     

            return redirect()->route('home')->with('message''Upload complete');

        }

      

    接下来,我们需要查看所有用户上传的文件,还需要一种下载它们的方法。

     

    我们将在 HomeController 中创建一个新的 downloadFile 路由和一个新的 downloadFile 方法:

    1

    Route::get(‘/files/{filename}’, ‘HomeController@downloadFile’)->name(‘downloadFile’);

      

     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    <?php

        /**

         * Download a file

         *

         * @param  string  $filename

         * @return \Illuminate\Http\Response

         */

        public function downloadFile($filename)

        {

            // Basic validation to check if the file exists and is in the user directory

            if (!Storage::has('files/' . auth()->user()->id . '/' . $filename)) {

                abort(404);

            }

     

            return response()->streamDownload(function () use ($filename) {

                FileVault::streamDecrypt('files/' . auth()->user()->id . '/' . $filename);

            }, Str::replaceLast('.enc''', $filename));

        }

      

    downloadFile 使用 Laravel 原生的 streamDownload response, 接收一个回调.

     

    在回调中,我们正在调用扩展包 FileVault 提供的 streamDecrypt 方法,它将对文件进行解密并将其逐段提供给 streamDownload 方法,从而允许您的用户直接下载解密文件。

    现在,我们需要在上传表单下方显示所有用户的文件。 为此,我们将 $files 变量从 HomeController 的 index 方法发送到 home.blade.php 视图文件,并在上传表格的下面显示用户文件。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    <?php

     

        /**

         * Show the application dashboard.

         *

         * @return \Illuminate\Contracts\Support\Renderable

         */

        public function index()

        {

            $files = Storage::files('files/' . auth()->user()->id);

     

            return view('home', compact('files'));

        }

      

    home.blade.php

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    <ul class="list-group">

        @forelse ($files as $file)

            <li class="list-group-item">

                <a href="{{ route('downloadFile', basename($file)) }}">

                    {{ basename($file) }}

                </a>

            </li>

        @empty

            <li class="list-group-item">You have no files</li>

        @endforelse

    </ul>

      

    就是这样! 我们现在在使用静态加密! 我们创建了供用户上传文件的表单,对这些文件进行加密,并且仅在上传文件的用户要求时才对其解密。

     

    工信部:截至去年底 中国5G基站建设共13万个

    展开全文
  • 网上搜的方式部分都是将加密的密文写入新的文件 解密时再次将解密的铭文写入第三个文件的方式本人自己实现了一个简单的在一个文件加密解密的操作 欢迎拍砖~---------------------------------------------------...
  • Crypto可以加密任何文件中的数据,不仅可以数据进行加密,还可以将其隐藏。您可以选择任何类型的文件并在其中隐藏有价值的数据,但是主机文件的大小不会增加。一个10kb的微型文本文件中的秘密数据。立即尝试。完全...
  • 使用 encrypt 助手方法像图像这样的小文件进行加密可以很好地工作,但是在此过程中,文件内容需要加载到内存中,这对于大文件来说是个问题。我已经搜索过用于解决此问题的软件包或解决方案,并遇到了这个 Stack ...
  • 最近在Android项目中,需要对大文件(几百MB)进行md5的加密校验,发现必会出现OOM异常并导致程序退出,因为没有对文件进行缓存处理,直接放入是会导致OOM的,因此在代码中加入缓存处理,如下代码所示:public ...
  • 手动对文件进行加密

    2019-10-03 03:40:48
    1.准备一张图片,和需要加密文件如两个音乐文件。 2.将需要加密文件压缩 3.新建一个txt,输入代码:copy/b 12.jpg+111.rar=222.jpg 然后将txt文档后缀名修改为.bat格式 4.点击运行1.bat文件,会...
  • 原理:python 利用迭代器读取大文件,然后通过rsa和des混合加密算法数据进行加密。des是对称性加密算法,rsa是非对称性加密算法。des对文件加密,通过rsades的key进行加密。解密时用rsa解密key,然后key解密文件...
  • 如何用C语言对文件进行简单加密

    万次阅读 多人点赞 2020-07-05 19:50:15
    最近在完成作业的时候需要实现一个用C语言对文件进行简单加密的操作,这里主要用的加密思路是破坏文件头,使得系统无法识别文件从而进行加密,最初的思路是将用户输入的加密口令转成ASCII码,再与文件头数据循环...
  • 现在的大数据文件越来越多,如:电影,...以下介绍如何使用闪灵文件夹锁快速大型文件加密的方法。 工具是必要的,首先,安装好软件,输入你的加锁/解锁密码。这个密码一定要牢记哦!! 然后,找个你要加锁或是隐...
  • AES文件加密.rar

    2020-04-24 10:36:16
    运用C#开发的AES文件加密解密软件,支持任意格式、任意大小文件加密。采用字节流的方式对文件加密,当文件过时可采用分块加密,确保大型文件加密解密成功
  • lis 文件加密

    2012-12-16 15:54:42
    LI文件是文件经过LIS文件加密系统[1]加密后的文件格式,如需要解密,请先下载LIS文件加密系统。 通过文件的深层加密,确保文件的所有者文件的独有访问权,本系统可自定义加密相关信息,由加密密钥直接确定访问...
  • RSA 算法(可以对文件加密

    热门讨论 2012-05-29 00:03:42
    此算法为RSA算法,可以CFile支持的所有文件类型加密,只是当文件比较时,可能会加密有点慢,不过对于新学校RSA的同学,还是很有帮助的,在VS 2010下编译通过,在VC6.0上也能正常编译。里面含有可执行的程序!
  • AES对称加密效率高,对大文件加密适合。RSA非对称加密效率低,更安全,对小文件加密适合。 整理 11:12 2016/8/4 加密:1.xml xml.md5摘要 2.(xml)aes加密 (xml.md5摘要 /n aeskey)RSA公钥加密 解密:1....
  • 我们知道文件存储的方式在计算机当中是以字节的方式进行存储的,可以通过对文件字节的操作来实现文件加密。下面的例子是通过读取文件的字节,然后使字节中的每一位取反(1变0,0变1),再进行倒置,来实现加解密过程...
  • 很多示例只能加密文件 这个可以加密大点的文件 文件加解密时间越长 package com.harp.oa.utils; import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import java....
  • 黑甲虫文件加密锁是一款非常专业的、专为硬盘加密的加密软件,该软件界面简单、体积小巧,能够为文件夹添加密码,并且还能够设置密保问题,功能十分强大,使用起来也很便捷。随着信息技术的发展,越来越多的人开始...
  • 文件加密软件.exe

    2019-08-17 13:04:40
    C#写得一个文件加密软件,可任何文件加密,有缺陷,需要你剩余内存比你要加密的文件。并且文件不大于2GB。基于 Rijndael。
  • using UnityEngine;using System.Collections;... public class Encrypt{ //DES需要秘钥desKey和desIv向量一起使用加密,它们的要求都是8个数组的字节数组, 如desKey=12345678转成字节数组 priva...
  • 文件加密

    2014-03-09 15:45:57
    本软件可以任何文件进行加密解密。 在密钥一样的情况下,第一次是加密,第二次是解密。但如果每次密钥都不一样,就相当于加密多次。想解密的话,需要倒序反着操作才可以。 本软件的密钥可以是数字,字符,也支持...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,003
精华内容 1,601
关键字:

对大文件加密