不错,转来备份。

转自:https://blog.csdn.net/shenshibaoma/article/details/79003854

前言

最近有需求要做视频的加密。因为视频下载到本地后,为了防止二次拷贝和二次上传到其他渠道,有些还是付费的视频,因此要对视频做加密,加密给了二周的研究时间,留下两周作为开发和测试阶段,故事就这样开始了!
分片加密
万事开头难。
“边播放边解密”,这是加密解密的最优方案,因此第一周研究的就是这些,当时想到如果可以获取到播放器的回调帧应该可以实现,我们用的是vitamio播放器(维他蜜,官方没有开源,甚至还收费,国内公司“一下科技”开发demo并发布到github,他们的公司爆款产品“秒拍”,“小咖秀”,“一直播”估计都是用的这个vitamio播放器)
一下科技适配的androidStudio版vitamio
vitamio 一下科技
首先感谢一下科技 ,我们公司用的就是这个,我之前很想进一下科技呢,明星公司吧!
回归正题,vitamio并没有提供数据帧的回调函数,后来想想,即使提供了这个回调,对于及时的加密和解密也是不行的,播放过程中解密用户解密会有卡顿,这个方案就抛弃了,不过七牛的播放器有提供数据帧的回调,七牛的产品我一直是信赖的,这个说是自主研发的,我也听说还是基于ijkplayer二次开发的,不过不重要了,我们能用就行了,其github地址如下:
七牛播放器
android版的demo很丰富,勾选视频帧回调,可以从log中看到当前帧的byte大小. 不过这个方案先暂时摒弃了.
最后,针对分片加密,看到了苹果公司的HLS(Http Live Stream)协议,他这个协议是苹果的动态码率自适应技术,主要用于PC和Apple终端的音视频服务。其包括一个m3u8的索引文件,TS(Transport Stream)媒体分片文件和key加密串文件。
HLS的关键其实是生成m3u8索引文件和TS媒体文件.
  这是一个完整的并且加密过的TS文件和m3u8索引文件,这个key是秘钥,可以看到m3u8索引文件里的内容都是按照HLS规范来编写的,ios系统天然支持m3u8,系统播放器都可以播放m3u8视频,android3.0之后支持HLS协议,因此也可以播放m3u8视频,目前android端vitamio,VLC等可以播放m3u8,因为你传给播放器的是一个m3u8索引文件,播放器会根据索引文件里的内容,播放相应的TS文件,如果TS是加密过的文件,则会先使用key解密ts文件并播放,其实很好理解,可以看西安上面的两个图片进行理解,最好可以自己尝试编写下.
两周的时间,研究得出,可以使用这个方式来进行视频的加密和解密,这个方案还是最好的,但是需要服务器的支持,服务器需要切片出TS文件并进行AES加密,然后客户端下载到本地丢给播放器播放,因为这种方式是基于HLS协议,m3u8格式固定,播放器可以自行解密,那问题来了,如果这样做,视频给其他播放器不是还是可以播放吗,解决方法是将m3u8索引文件再次加密下,索引文件也就几十kb,加密后,客户端解密后丢给播放器播放,这样第三方的播放器就播放不了了,我其实很想将这个方案运用到项目中,但是服务器压力比较大,本次的需求只是将视频下载到本地,然后加密,解密播放即可,最后就暂时放弃了这个方案,也许后续的版本会使用这个方案,敬请期待吧!
HLS,m3u8,TS相关资料

异或加密

异或加密其实不算是加密,因为它是对文件进行前后的反转,因为我们知道播放器从开头开始播放的,我们把开头的几十或者几百字节进行异或加密,则播放器就播放不了了,而两次异或加密就是解密,这种方法比较简单,适合比较简单的加密,而且容易破解,因此不建议使用,当然大家可以适当的了解下.
异或加密的介绍
这种方式的加密对于大文件来说也是不耗时的,非常快,我们可以使用RandomAccessFile这个类来随机读取文件的内容进行异或,播放器是从头开始播放的,我们就从头开始,异或几十个字节即可完成加密,解密操作就是再进行一次异或即可.

前,中,后,对文件加密2M的长度

最后确定使用的方案是对文件进行前中后进行三段加密,加密总长度为2M的大小(即前面读取512kb,中间读取1M,文件末尾读取512kb).
这三段加密都涉及到文件的读取,尤其对于大文件的读取,我们使用java的RandomAccessFile(随机访问文件)
这个类来进行文件的加密和解密.
RandomAccessFile有两种模式 一种是“读写”模式(rw),另一种是“只读”模式(r),它没有“只写”模式,ios使用的fopen有只写模式.
  1. RandomAccessFile sourceRaf = new RandomAccessFile(sourceFile, “r”);
  2. RandomAccessFile tempRaf = new RandomAccessFile(tempFile, “rw”);
我们使用这个类对文件进行加密和解密的操作.
针对这块基本是文件的读取,我就不做过多的描述,源码如下,CSDN没有分了,过段时间免费开源,见谅!
Demo截图:
1.1G 文件加密耗时:
1.1G文件解密耗时:
源码地址:
文件前中后三段加密

遇到的问题

1.分片加密时,要在手机端先走通这个流程,即自己完成TS切片,加密TS,自己编写m3u8索引文件,然后手机端使用vitamio播放器进行播放,这个过程,ios自身系统播放器不支持本地播放m3u8的视频文件,android端使用vitamio传入本地路径可以播放m3u8视频,ios换成vitamio后也可以进行播放;第二个是要播放加密的m3u8文件,首先要对TS进行AES加密,生成key文件,手动编写m3u8文件,然后传入播放器测试,分片加密耗时两周测试完成,说明这个方式是可行的,我也非常想使用这个方式,但是针对目前需求稍许简单,服务器使用TS切片等压力较大,暂时摒弃.
2.异或加密非常的快,对于大文件,但是基于他非常的简单,容易破解,摒弃.
3.文件的前中后加密,这种方式是比较不错的,PC端用于对小文件的加密操作比较多,在使用RandomAccessFile进行追加内容时,需要手动将指针移动到当前文件长度的位置,即raf.seek(xxx),再进行raf.write()追加操作.

Android视频加密那点事儿!相关推荐

  1. android视频流加密,android 视频 加密/解密(使用AES)

    java语言进行加密解密速度挺慢的..一个6MB左右的文件需要10多秒...等有空了瞅瞅ffmpeg去.. MainActivity.java /** * 视频加密/解密 * * @author ol ...

  2. Android 代码实现视频加密,android实现视频的加密和解密(使用AES)

    java语言进行加密解密速度挺慢的..一个6mb左右的文件需要10多秒...等有空了瞅瞅ffmpeg去.. mainactivity.java /** * 视频加密/解密 * * @author ol ...

  3. android 大文件加密,如何在android中加密大视频文件

    我有一个应用程序,我正在使用该代码来解密已加密的文件.文件位置是"/mnt/sdcard/myfolder/test.mp4". test.mp4文件大小约为20MB.如何在and ...

  4. android平板加密软件,购买安卓视频加密软件

    当前位置:首页 >安卓视频加密软件> 各帐户类型价格表 - 有绑定安卓设备版本 以及 绑定TF卡版本 超时代软件是全国推出支持全平台的视频加密跨平台方案的开发商, 全面支持iPhone,i ...

  5. android 本地视频加密软件,使用教程

    当前位置:首页 >安卓视频加密软件> 安卓视频加密软件试用教材 网络版主要分为三个部分, 一是加密端, 二是后台, 三是超时代安卓加密播放器. 下面将简单介绍整个流程. 1.登录后台, 创 ...

  6. MediaCodec在Android视频硬解码组件的应用

    https://yq.aliyun.com/articles/632892 云栖社区> 博客列表> 正文 MediaCodec在Android视频硬解码组件的应用 cheenc 2018- ...

  7. 鸿蒙密视视频加密软件,鸿蒙密视视频加密软件

    鸿蒙密视针对视频夸平台的离线观看.防拷贝.防刻录.防一号多人使用等问题,推出专门针对企业视频防护完整解决方案,鸿蒙密视视频加密软件,实现对视频数据安全的保护. 功能特点 1.支持所有视频音频格式 鸿蒙 ...

  8. 视频加密方法自己做的一些调研

    视频加密调研 参考: https://www.zhihu.com/question/24561177 1.视频地址混淆加密 参考地址:https://www.bbsmax.com/A/l1dyPq90 ...

  9. Android FDE 加密过程

    Android Full Disk Encryption Settings中加密入口 调用关系 加密实现 参考 Vold properties init properties init actions ...

最新文章

  1. 赠书 | 从阿里到Facebook,一线大厂这样做深度学习推荐系统
  2. javascript操作select下拉列表框的一点小经验
  3. SAP CRM Fiori 应用的 offline 离线支持开发笔记
  4. 面向 Web 前端的原生语言总结手册
  5. 1008 数组元素循环右移问题 (20分)
  6. Java 基础之java运算符
  7. 听同事讲 Bayesian statistics: Part 1 - Bayesian vs. Frequentist
  8. 联发科技 --联发科技简介++附上笔经面经
  9. Android Content Providers(二)——Contacts Provider
  10. 《社会调查数据管理——基于Stata 14管理CGSS数据》一3.4 Stata的一些术语及使用通则...
  11. 第一次给笔记本换固态硬盘
  12. “0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”
  13. 计算机网络的简单实验
  14. 上取整与下取整的解析
  15. python爬取收费漫画_Python爬虫,爬取腾讯漫画实战
  16. 如何恢复因为chrome同步而删除的书签
  17. centos7.2安装dcos
  18. 大一作业HTML个人网页作业(宠物狗)
  19. 黑马程序员:Socket编程之(UDP vs TCP)
  20. Java实现 字符串加密 输入字符串进行简单的位运算,输出加密或解密后的字符串

热门文章

  1. windows 命令行打印
  2. 机器人学习之ReorientBot: Learning Object Reorientation for Specific-Posed Placement(ICRA 2022)
  3. java根据html生成word文档,Java之HTML富文本导出WORD(不含图片)
  4. CDR中如何将对象在页面居中显示
  5. 【SQL】Attempt to do update or delete using transaction manager that does not support these operations
  6. js 获取域名和页面完整地址
  7. 诗歌(9)—题西林壁
  8. Java测试完整指南
  9. Ubuntu系统上远程桌面,samba,ftp,vncserver,ssh服务器,teamviewer安装配置
  10. git菜单形式的_全新的导航形式:全屏菜单