Android视频加密那点事儿!

不错,转来备份。

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

前言


  最近有需求要做视频的加密。因为视频下载到本地后,为了防止二次拷贝和二次上传到其他渠道,有些还是付费的视频,因此要对视频做加密,加密给了二周的研究时间,留下两周作为开发和测试阶段,故事就这样开始了!


分片加密

   万事开头难。
   “边播放边解密”,这是加密解密的最优方案,因此第一周研究的就是这些,当时想到如果可以获取到播放器的回调帧应该可以实现,我们用的是vitamio播放器(维他蜜,官方没有开源,甚至还收费,国内公司“一下科技”开发demo并发布到github,他们的公司爆款产品“秒拍”,“小咖秀”,“一直播”估计都是用的这个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,加密后,客户端解密后丢给播放器播放,这样第三方的播放器就播放不了了,我其实很想将这个方案运用到项目中,但是服务器压力比较大,本次的需求只是将视频下载到本地,然后加密,解密播放即可,最后就暂时放弃了这个方案,也许后续的版本会使用这个方案,敬请期待吧!




异或加密


异或加密其实不算是加密,因为它是对文件进行前后的反转,因为我们知道播放器从开头开始播放的,我们把开头的几十或者几百字节进行异或加密,则播放器就播放不了了,而两次异或加密就是解密,这种方法比较简单,适合比较简单的加密,而且容易破解,因此不建议使用,当然大家可以适当的了解下.


这种方式的加密对于大文件来说也是不耗时的,非常快,我们可以使用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()追加操作.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值