Android 如何在移动设备上安全地存储数据?

Android 如何在移动设备上安全地存储数据?,android,ios,mobile,encryption,cryptography,Android,Ios,Mobile,Encryption,Cryptography,我应该设计/实现一个适用于IOS和Android的视频流应用程序的加密解决方案。我的主要加密要求是在移动设备上加密视频流,并防止用户在任何其他设备/程序上运行它。因此,我需要一个好方法在每次播放期间解密流,而不必每次都麻烦用户输入密码 问题是我对密码学还不熟悉(也不熟悉移动编程),而我的创业公司并没有足够的资源来聘请这方面的专家。通过阅读一些在线资源以及stackoverflow,我对最先进的密码设计实践进行了大量的研发。我学到了一些重要的原则,并自然地在几个新问题中结束,这些问题的答案在任何地

我应该设计/实现一个适用于IOS和Android的视频流应用程序的加密解决方案。我的主要加密要求是在移动设备上加密视频流,并防止用户在任何其他设备/程序上运行它。因此,我需要一个好方法在每次播放期间解密流,而不必每次都麻烦用户输入密码

问题是我对密码学还不熟悉(也不熟悉移动编程),而我的创业公司并没有足够的资源来聘请这方面的专家。通过阅读一些在线资源以及stackoverflow,我对最先进的密码设计实践进行了大量的研发。我学到了一些重要的原则,并自然地在几个新问题中结束,这些问题的答案在任何地方都找不到,因为这些问题对于任何算法都不是太具体

我学到的是:

  • 加密技术会使我的流速度变慢。我需要明智地使用它
  • 开发人员/设计人员不应试图自行“发明”新的加密算法。始终建议使用现有的经验证的解决方案
  • 解决方案的优点/缺点不在于算法的设计/选择,而在于密钥管理和密钥管理策略
  • 在移动设备上存储解密密钥是不可能的,每个人都建议不要这样做。因此,这排除了使用任何基于PKI的方案的可能性。唯一可能的解决方案是要求用户每次输入密码来解密流
  • 我想到了使用和在移动设备上实现PKG。但很快我意识到,这也需要在设备上存储一个“秘密”,这与上面的问题是一样的
  • 在读了很多文章/问题/解决方案后,我总结了我能做的事情

  • 我将在C++中实现该解决方案,尽可能地模糊代码。
  • 我将使用AES 256对称方案进行加密/解密
  • 我将使用设备中的多个参数和多个级别的散列(并将每个级别中的参数添加为salt以使其尽可能复杂)来派生一个散列,该散列将充当密钥。这将(希望)安全地识别我的用户安装。这是从中得到启发的
  • 我会在将数据下载到设备上后对设备本身的数据进行加密。从服务器到客户端,我会进行某种置乱,其密钥将被编码为算法(例如:空间填充曲线方法)。我知道这可能是最薄弱的环节,但我以后会找到更好的解决办法
  • 我的问题是:

  • 即使读了所有这些,有一件事我还是不清楚。有几种算法。攻击者如何知道产品中使用了哪种算法?只有攻击者知道它,他才能想出破解它的方法,对吗?举一个弱DES算法实现的例子,只有当攻击者知道我在使用DES时,她才能找到破解它的方法。她怎么知道的?我可以通过在程序中设计一个接口/声明字符串来欺骗攻击者,使攻击者相信我在实现AES,但实际上我只是在实现DES吗?密码设计师是否会采用这种方法

  • 我生成密钥的方法是否违反了不要重新发明新算法、重用经过尝试和测试的解决方案的一般建议?我相信我不会那么做。我使用标准的AES,但只是找到了一种新的方法(我自己刚刚发现,我知道以前有几个人会这样做)来管理密钥。我错了吗

  • 很抱歉,我的问题有点抽象。这是因为我仍处于设计阶段,尚未具体实现某些东西

    我的主要加密要求是在移动设备上加密视频流,并防止用户在任何其他设备/程序上运行它

    这被称为“DRM”。有两种类型的DRM:已经破解的DRM和还没有人尝试破解的DRM

    我的创业公司没有足够的资源为此聘请专家

    那么,你的创业公司应该利用自己的时间做其他事情

    我将使用AES 256对称方案进行加密/解密

    这违反了你学到的第1、第4和第5条

    攻击者如何知道产品中使用了哪种算法

    通过查看您的代码

    我可以通过在程序中设计一个接口/声明字符串来欺骗攻击者,使攻击者相信我在实现AES,但实际上我只是在实现DES吗


    只有真正愚蠢的攻击者。IQ高于普通rock的攻击者只需在你完成所有解码工作后,修改你的应用程序,将所有解码的字节写入磁盘即可。毕竟,必须在您的过程中对字节进行解码,才能将其显示给用户,这意味着修改您的应用程序的攻击者可以使用这些字节。

    不幸的是,加密无法帮助您进行混淆。更多关于这个主题:解密比视频解码快得多。特别是如果您稍微减少了轮数,因为在DRM方案中,与安全密钥管理的不可能性相比,算法的强度无关紧要。例如,ChaCha8将在一个内核上每秒解密几百兆字节。@ntoskrnl:链接很好,谢谢。@CodesInChaos:谢谢您的输入。我还没有实现这些。谢谢你的投入。我阅读了各大巨头尝试DRM的历史,以及它们是如何在短时间内被破解的。最后一部分非常有用。对于一个普通的程序员来说,重用我的代码是不应该的。我从来没有想过这件事