Php 加密存储的图像

Php 加密存储的图像,php,Php,我正在准备一个项目,需要以加密格式存储图像。图像将在0.5mb和5mb之间,并且必须保持原始质量 我曾考虑使用base64对它们进行编码,但随后我需要使用一些东西对它们进行加密(SHA1?),并将它们保存为服务器上的文件 有人能给我提供这方面的建议吗?我可以将加密图像存储在哪种文件中 提前感谢我必须执行类似的任务,将上传到应用程序中的文件加密存储在服务器中,然后当用户需要应用程序中的文件时,在发送到浏览器之前对其进行解密 我不得不这样做,因为我的申请涉及我国法律要求加密存储的特殊类型的数据(家庭

我正在准备一个项目,需要以加密格式存储图像。图像将在0.5mb和5mb之间,并且必须保持原始质量

我曾考虑使用base64对它们进行编码,但随后我需要使用一些东西对它们进行加密(SHA1?),并将它们保存为服务器上的文件

有人能给我提供这方面的建议吗?我可以将加密图像存储在哪种文件中


提前感谢

我必须执行类似的任务,将上传到应用程序中的文件加密存储在服务器中,然后当用户需要应用程序中的文件时,在发送到浏览器之前对其进行解密

我不得不这样做,因为我的申请涉及我国法律要求加密存储的特殊类型的数据(家庭暴力)。所以我理解OP的情况,不是因为技术原因他需要加密,而是为了遵守法律

我所做的是在服务器上安装OpenSSL,这样我就可以使用它对文件进行AES-256加密,您可以使用
system()
从php执行命令

要加密的命令是:

echo MyPassword | openssl.exe aes-256-cbc -pass stdin -salt -in somefile.pdf -out somefile.pdf
对于解密:

echo MyPassword | openssl.exe aes-256-cbc -pass stdin -d -in somefile.pdf -out decriptedfile.pdf
此命令接受任何原始文件(无论格式如何),解密时会重新创建相同的精确文件,因此不需要base64编码或类似的内容,您将反馈给它们的内容将返回给您


请参阅,了解迁移服务器时可能需要注意的事项。

此操作并不简单;您不仅需要加密数据,还需要确保数据安全,以防被盗或服务器入侵;您还需要考虑如果需要更改密钥会发生什么。

要加密图像,最好的选择可能是使用对称算法mcrypt。有几个教程介绍如何做到这一点。看

您需要做的是为图像提供服务并动态解密,而不必将其存储在明文中

现在的问题是在哪里保存密码。最好的总体解决方案是为每个用户提供一个秘密加密密钥,在用户登记时随机生成;而且密钥本身是使用用户密码进行非对称加密的。您可以在RSA中使用
phpseclib
。同样的加密密钥也与管理密码不对称存储

因此,工作流程是:

  • 用户登录(并提供其密码)
  • 系统将密码散列与存储的散列进行比较,并授予访问权限(您将使用bcrypt:see之类的内容)
  • 系统还解码加密字符串并将其存储在临时会话中(会话的持久性可能是需要解决的问题!)
  • 他现在可以访问该用户的所有图像
  • 要加密图像,请执行以下操作: -如果用户上载图像,则在上载时,会话中的加密密钥可用。使用它:-) -如果以其他方式上载图像,则会在数据库中设置“已加密/仍需加密”标志,并尽快(管理员登录/用户登录)执行所有挂起的加密操作

    然后将图像存储为加密文件(“001823040.bin”)。除了在数据库中,没有引用,它属于哪个用户;由于不知道用户(因此加密密钥),图像无法恢复

    要提供图像,您只需将标题设置为图像类型,然后开始解码文件,并将其以清除方式输出到用户的浏览器

    从攻击者的角度来看,单独使用图像是没有用的,因为它们是加密的。用户数据库是无用的,因为加密密钥本身是加密的。窃取或粗暴使用一个用户的密码只能访问该用户的加密密钥,这与所有其他用户的加密密钥不同,然后仍然需要查找属于该用户的图像

    如果需要更改用户的密码,仍然可以使用管理密码恢复加密密钥,并使用用户的新密码对其进行非对称重新加密这不能自动完成,因为这意味着将现在非常重要的管理员密码存储在系统上的clear中;因此,所有忘记密码的用户都会成批排队,管理员会在早上收到“有75人等待密码恢复”的通知,提供密码,然后将其全部解锁

    这很尴尬,但不幸的是,所有其他解决方案都依赖于本地可用的明文密码,在这种情况下,安全漏洞会使系统完全开放

    (您有时可以通过设置第二个非常小、非常有限(因此不易受攻击)的服务器作为加密托管服务来解决此限制;但维护起来要复杂得多)

    多用户/密码方案 您在一个表中有一个资源,并且有几个用户U1、U2、。。。联合国拥有对该资源的访问权。这意味着用户U1必须能够访问资源A的解密密钥

    您可以通过存储UserAccessToResource表来实现这一点:

    user_id         -- the user ID
    resource_id     -- the resource ID
    encryption      -- resource decryption key, encrypted with the user's encryption **key**
    
    要授予对用户U1和资源A的访问权,您必须自己拥有对资源A的访问权以及对U1的加密密钥的访问权。即:

    • 管理员访问Users表并恢复UserKeyEncryptedWithAdminKey
    • 作为管理员,他可以解密用户密钥
    • 以相同的方式访问ResourceTable[A]。ResourceKeyEncryptedWithAdminKey
    • 他使用UserKey加密ResourceKey,并将其存储到UserAccessToResource中
    用户U5经过并可以快速验证(5,42,?)是否存在于UserAccessToResource表中,因此他知道他可以访问资源。检索该行,并解密ResourceKey。他现在可以访问资源[42]并使用ResourceKey对其进行解密(但没有其他资源,因为它们具有不同的随机ResourceKey)

    在所有这一切中,前端