【问题标题】:Secure keypair encryption solution in Delphi & PHP?Delphi & PHP 中的安全密钥对加密解决方案?
【发布时间】:2012-05-22 16:40:15
【问题描述】:

我的应用程序通过互联网发送加密文件,我需要能够执行以下操作:

  1. 客户端 Delphi 2010):使用 我的应用程序附带的公钥加密文件并将其上传到服务器
  2. 服务器端 PHP):使用我的存储在服务器上的私钥解密上传的文件
  3. (处理上传的文件...)

听起来很简单,但我找不到任何可靠的代码/组件,我找到了这些组件:

  1. DCPcrypt。这是我现在在开发中使用的,但似乎不支持基于密钥对的加密(RSA?)

  2. GnuPgp (GPL) 所以我不能在我的商业应用上使用它。

  3. TurboPower LockBox 3:确实支持密钥对加密,但非常神秘(没有 AFAIK 文档)并且似乎不支持文件加密。

我的问题是:是否有一个安全/可靠加密组件:

  1. 实现我上面描述的(即密钥对加密)
  2. 可以使用 PHP 解密
  3. 适用于大文件/流
  4. 在这里做梦!)有一个简单的 delphi/php 演示来说明如何做到这一点? :)
  5. 请仅提供 FOSS 解决方案,我已经超出预算 :)

【问题讨论】:

  • 好的免费加密货币意义不大——它需要大量的编程、安全和数学技能。
  • 通常你不会使用 RSA 等加密整个文件,因为它通常比较慢。您使用对称算法加密,而不是加密使用非对称算法的密钥。只要您使用正确实现的标准算法,PHP 和 Delphi 都可以使用数据。 LockBox 3 恕我直言,这不是一个好的库。
  • @EugeneMayevski'EldoSCorp:你有没有很好的折扣券可以给我用于 SecureBlackbox? :)
  • @Gdhami 如果你私下联系我。

标签: delphi security encryption rsa lockbox-3


【解决方案1】:

我会选择 OpenSSL。
PHP 似乎有很多支持它,虽然我还没有真正尝试过: 例如the manualan example here

使用我在这里多次提到的东西:http://www.disi.unige.it/person/FerranteM/delphiopenssl/。该页面上也有一些很好的例子。并查看 Indy OpenSSL 导入。

不是特定的组件,但绝对是免费的、灵活的,并且完全有可能在安全方面拍摄自己的脚 :-)

编辑:

对于 Delphi,我会考虑使用 EVP_Seal* 函数,您可以在 this SO answer 中找到我的精简版 libeay32.pas 文件。您需要这样做,因为 Indy 没有显示或实现很多/任何实际的 EVP_ 函数,因此您需要导入函数声明和一些其他例程。

对于 PHP,this link 似乎是正确的对应物。

作为奖励,这应该让您了解如何使用 EVP_Seal* 东西(未经测试):

function EVPSeal(ASource: TBytes; const APublicKey: PEVP_PKEY; out Key: TBytes; out IV: TBytes): TBytes; 
var
  cipher: PEVP_CIPHER;
  ctx: EVP_CIPHER_CTX;
  buf: TBytes;
  block_size, buf_start, out_len, keysize: integer;
  ek: array[0..0] of PByte;
  ekl: array[0..0] of integer;
  pubk: array[0..0] of PEVP_PKEY;
begin
  keysize := EVP_PKEY_size(APublicKey);
  cipher := EVP_aes_256_cbc;
  SetLength(IV, EVP_MAX_IV_LENGTH);
  SetLength(Key, keysize);
  ek[0] := @Key[0];
  pubk[0] := APublicKey;
  buf_start := 0;
  EVP_CIPHER_CTX_init(@ctx);
  try
    EVP_SealInit(@ctx, cipher, @ek[0], @ekl, @IV[0], @pubk[0], 1);
    block_size := EVP_CIPHER_CTX_block_size(@ctx);
    SetLength(buf, Length(ASource) + block_size);
    SetLength(Key, ekl[0]);
    EVP_SealUpdate(@ctx, @buf[buf_start], out_len, @ASource[0], Length(ASource));
    Inc(buf_start, out_len);
    EVP_SealFinal(@ctx, @buf[buf_start], out_len);
    Inc(buf_start, out_len);
    SetLength(buf, buf_start);
    result := buf;
  finally
    EVP_CIPHER_CTX_cleanup(@ctx);
  end;
end;

【讨论】:

    【解决方案2】:

    啊,加密货币。有一种说法是,一个对加密一无所知的程序员比一个对加密一无所知的程序员危险得多。

    以非常相似的方式,我花了相当长的时间试图找到一种使用开源进行数字 XML 签名的方法。我只有managed to get so far,然后才系好安全带并获得rock solid third party library。就纯粹的货币意义而言,它并不便宜,但却是我迄今为止最好的投资之一。

    (真实的故事:我实际上与这个库的作者发生了一场小冲突,甚至从 cmets 中删除了。唉,我最终还是从他那里买了东西。算了。) p>

    【讨论】:

    • 所以,你的答案是,还是是,但这比我愿意追求的要难,我曾经和某人发生过争执?
    • @RobKennedy - 如果你觉得答案不值得你花时间,那就投反对票吧。
    • 我只是不确定你的答案是什么
    • 您会花费时间或金钱吗?我提供了一个指向先前问题的链接,其中包含指向几个开源库的链接,以及一个商业产品,恕我直言,如果您需要 Delphi 中的加密,这正是您所需要的。没有其他要添加的内容,因为没有太多(考虑到 GPL 被排除在外,更是如此。)
    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多