1

我需要一种安全的方式将我的用户联系信息临时存储在 mysql 数据库中。

我不希望我的客户敏感信息落入坏人之手,所以这就是我要寻找的:

  • 只有预期的收件人才能解密信息(用户名是唯一的,可以用作签名/密钥?)
  • 加密必须完全在函数内处理,没有外部程序或服务,换句话说,对最终用户是不可见的。
  • 简单,防弹且易于理解,因为我远非安全专家,可能的漏洞可能会绕过我。

有人对我有什么建议吗?要阅读的文章,我可以查看的框架,甚至是一些示例代码?任何帮助都深表感谢。

4

2 回答 2

0
  1. 我不会使用 md5,使用 sha1 或 sha256。
  2. 使用每个用户的盐,例如:

$salt = bin2hex(openssl_random_pseudo_bytes(6));
$password = sha256($account_creation_time . '-' . $salt . '-' . $plain-password);

然后将 $salt、$password 以及帐户创建时间存储在数据库中。

于 2013-10-06T13:13:32.447 回答
0

嗯,这个问题实际上是一个非常好的问题。有一种方法可以确保不会发生此类问题。但首先我想弄清楚散列和加密之间的区别

散列是当我们将主题转换为长散列时。这很难逆转,需要大量资源才能做到。我们通常散列密码等加密是当我们想要安全地存储数据但希望能够将其取回时,我们将其转换为另一个很长的东西,但我们也可以轻松地将其反转(如果我们知道密钥)

您可以使用所谓的“盐”来保护您的密码等哈希值,因为我们知道 Hash(x) 与 Hash(x+y) 非常不同,我们可以使用它。虽然如果我是你,我不会使用 MD5,它仍然很棒,但已经看到了冲突(很多散列算法都有它们,但被发现会降低它们的安全性)。我推荐你使用 sha256/sha512。它们非常安全,到目前为止还没有发现任何已知的碰撞。

除了我是书呆子,你的问题很简单。我将在我的示例中使用 php 的哈希函数。既然您说用户名是唯一的,您可以将其用于非常安全的哈希系统

$password = YOUR_PASSWORD_HERE;
$username = USERNAME_OF_USER;
$safe_hash = hash("sha512",$password.$username);

这会合并两个用户名和密码,并使用 sha512 算法对它们进行哈希处理(如果需要,请更改算法)。这是非常安全的,因为 'password'.'user1' 的哈希值与 'password'.'user2' 不同

如果您想让它更加安全,您可以添加其他内容,例如创建时间、姓氏、名字、手机号码、电子邮件、创建时间,以及您知道并且最好是唯一的任何内容。

至于加密数据(以便您可以根据需要取回),您可以使用 mcrypt。您可以使用mcrypt_encryptmcrypt_decrypt。您可以指定要使用的密码以及要使用模式。然后,当您想要恢复数据时,您可以再次将密钥、算法、模式和 mcrypt_encrypt 给您的无意义输出提供给 mcrypt,您将获得原始数据。

我建议通过使用哈希来使用非常安全的密钥,因为很难对它们进行逆向工程。使用具有良好且唯一字符串的 sha-256 哈希(我建议在哈希字符串中混合多条数据)将帮助您保护所需的数据。

于 2013-10-06T13:11:00.850 回答