【问题标题】:PHP plain text encryption - keeping key safePHP纯文本加密 - 保持密钥安全
【发布时间】:2013-08-05 07:13:44
【问题描述】:

在典型的网络场景中,网站用户会出现,使用网站,填写表格,并将数据传输到服务器存储在数据库中。现在假设我们需要确保他们的地址被加密,因为它是绝密的,只有那些可以访问网站后端的人才能看到那个地址是什么——这很容易实现,对吧?我们只需在服务器端存储一个加密密钥,该密钥将用于生成加密数据,将数据存储在数据库中,然后我们将再次使用该密钥对其进行解密。

现在假设托管公司的某个人要浏览您服务器上的文件 - 他们可以很容易地访问此加密密钥,然后使用它来解密他们想要的任何数据,因为数据库中的所有地址都已加密用同样的钥匙!

我只是试图用新的安全模型覆盖每个基础,并且在“不信任任何人”的政策中,我正在寻找阻止托管公司获取数据的方法。

那么有没有人有任何建议来阻止那些拥有服务器访问权限的人获取密钥和解密数据?密码加盐是否会有所帮助,或者他们仍然能够很容易地解密数据。

我想不出办法来解决这个问题。有没有人有任何解决这个特殊问题的建议?

【问题讨论】:

  • 托管自己的服务器可以解决这个特定问题,但我猜这不是一个选择?
  • 我想到了一个主意.. 你能把你的密钥存储在另一个域中吗?与数据库和代码隔离...也许是一个探索的选择:)
  • 或者使用不同的托管公司——一个用于加密密钥,另一个用于数据?
  • 除了,即使托管公司仍然可以访问您的代码,并且只需进入并查看您从哪里获取密钥并从其他域获取密钥,就像您的代码获取一样它
  • 认为一旦数据被加密就不会被猎物发现是一种常见的误解。它不是,即使没有钥匙。所以真正的问题是:什么努力才能达到额外的安全级别?

标签: php security encryption key


【解决方案1】:

在浏览器中加密和解密发送到主机的所有内容。使用在客户端输入的密码进行加密,并且永远不要将密码发送给主机。 Host-proof Hosting 有更完整的描述

【讨论】:

  • RE:您的链接。 The server is limited to persisting and retrieving whatever encrypted data the browser sends it, and never actually accesses the sensitive data in its plain form。这违反了and only those with access to the back end of the website should be able to see what that address was 的提问者要求
  • 他的服务器在没有用户在场的情况下如何使用用户信息?例如,如果服务器需要使用用户地址自动向用户邮寄某些东西,则服务器无法解密地址以制作邮寄标签,直到用户登录并输入他们的密码。
  • @PatrickEvans 这不是 OP 发布的要求的一部分
  • @RiggsFolly 不止一个人可以合法地知道密码。
  • @MikeW,only those with access to the back end of the website should be able to see what that address was,这正是他的要求,为了获得地址,他们必须使用服务器来获得它。因此,如果只是为了显示信息,服务器必须以某种方式处理信息。要对其进行任何操作,必须先对其进行解密。
【解决方案2】:

我想这对于共享主机来说是一种风险。我在我的大部分项目中使用 amazon aws,在我的个人博客中使用 linode。两种解决方案都采用“你是你自己的系统管理员”的模型,没有人窥视你的机器。

如果我站在你的立场上,我会使用带有可变密钥的 mcrypt。例如,同一行的用户名字段。这样,为了使数据受到破坏,入侵者需要访问您的数据库和源代码,以弄清楚如何解密数据。到那时,您的问题将比单纯的信息泄露更糟糕。

【讨论】:

  • 它是一个专用服务器,但由公司管理。我不能绝对确定他们不会访问数据库或网络文件,所以我正在寻找一种解决方案来阻止他们解密数据以确保安全。
【解决方案3】:

大多数托管公司都可以访问所有糟糕的数据库和文件。

几年前,我做了一些加密和解密实验。

最好的办法是拥有个人服务器,但这并不便宜。

示例 RC4 加密需要密钥来加密数据。现在棘手的部分是使该密钥也使用其他加密方式(如 BASE 64、ATOM 128)进行加密。这不会使其 100% 安全

但是解密数据真的很难。

希望你能理解我。

干杯:)

顺便说一句,没有 100% 安全的数据。

【讨论】:

    【解决方案4】:

    如果您不需要能够在线解密数据,这是 公钥加密 的理想情况。特别是密封 API。例如,使用 libsodium (PHP 7.2):

    加密

    $store_me = sodium_crypto_box_seal($plaintext, $box_publickey);
    sodium_memzero($plaintext);
    

    解密

    $plaintext = sodium_crypto_box_seal_open($stored_msg, $box_keypair);
    

    但是,如果您确实需要能够解密来自网络服务器的数据,那么任何访问网络服务器的人都可以窃取密钥并解密您的数据。没有任何加密算法可以阻止拥有密钥的人解密消息。

    始终以threat model 开头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-23
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2011-11-10
      • 2017-08-11
      • 1970-01-01
      相关资源
      最近更新 更多