我想知道是否有人可以就文件加密给我一些建议,我目前正在构建一个内部网,它需要具备的一个功能是用户将文件发送给其他用户,http://www.mailbigfile.com/是一个我希望实现的例子。目前这是通过SSL完成的,我在上传之前使用PHP来验证文件类型等。我遇到的唯一问题是我的雇主要求我在上传前加密文件,他们还希望每个上传的文件都使用随机盐加密作为额外的安全措施。我主要担心的一个问题是文件类型并没有真正受到限制,所以它可以是从jpeg到word文档的任何内容,到目前为止我发现用php加密word和pdf文件很困难。所以我想知道是否有人可以给我以下的建议
1.如果您使用SSL并限制对目录的直接访问
,则需要加密文件2.我应该使用php进行加密,例如MCRYPT还是有其他选择。从之前的某个帖子中有人推荐使用PEAR
Php file encryption methods. Does something simple exist?
提前致谢
答案 0 :(得分:1)
1)不是为了转移,但我认为这里的重点是以安全的方式存储文件,这样即使你以某种方式获得了文件的访问权限,也不能在不知道加密和盐的情况下使用它。您将生成salt并将其与对文件的引用一起保存在db中。我们的想法是,如果某人获得了对该文件的访问权限而不访问该数据库,则该文件将无用,因为攻击者对该文件一无所知。当有人请求下载文件以及谁被授权时,您需要先将其解密,然后再将其发送给客户端。猜猜你的要求是什么?
2)我会做一个后备,如果没有,可以使用模块中的mcrypt函数,如果没有回退到PEAR,因为pear会慢于模块。但是你说它是一个内部网,所以添加mcrypt模块应该很容易。
答案 1 :(得分:0)
在上传之前加密每个文件意味着它必须在客户端计算机上进行。因此,必须使用单独的程序(例如,GNU PG)或在浏览器中执行此操作,例如AES via Javascript(或Java applet,或执行相同操作的Flash)。
不需要通过SSH加密传输文件,因为协议已经这样做了。但是,虽然文件在线上是安全的,但是任何有权访问接收者机器(和服务器)的人都可以读取该文件。如果这是一个问题,您必须加密文件。
最大的挑战是以安全的方式从发件人到收件人传递加密密钥。这完全不重要,如果做错了会使整个多层加密过程和添加大量盐无用。例如,如果加密密钥位于收件人下载文件的服务器上(通过SSH),那么任何对服务器(管理员或入侵者)有足够访问权限的人都可以使用存储在那里的密钥解密文件,所有加密都没用。公钥加密是解决该问题的一种方法。我之前提到过GNU PG吗?
对于“salt”,这是错误的术语,你可能意味着“初始化向量”(salt用于散列函数,而不是用于加密)。
“需要个人IV”要求的解决方案相当简单:生成一个或两个块的伪随机数据(还添加一些真正的随机或非随机但变异的数据,例如nanotime
之类的数据如果你可以)在客户端计算机上。对于AES,两个块将是32个字节(256位),这几乎是几个现代加密散列函数的输出大小。
这使得例如可以将来自附近SQL服务器的纳秒时间戳SELECT RAND();
,服务器回答的时间以及浏览器历史记录中的5个最后查看的站点连接成10-20个伪随机字符(甚至是来自较差的生成器)所有这些都进入SHA-256,并将输出用作实际上不可预测的初始化向量
将文件传输到收件人后,将其解密,并忽略前32个字节。