2012-11-27 182 views
2

首先,我想迭代一下,我不问如何散列密码(如salting/bcrypt/etc)。对于我所做的其他项目,我总是散列/腌制密码,但在这种情况下,我需要暂时重新获取密码。如何安全地加密密码

基本上,我需要在我的数据库中存储一个密码,然后再次访问它。在codeigniter(我使用的框架)中,他们使用mcrypt以及一个关键字(他们认为这应该是32个字符长)。这足够吗?

编辑

之所以问:我需要能够对关键敏感PDF文件发送给用户,并希望用密码保护他们(最好使用相同的密码)。

在与人们讨论SO和off之后,我得出结论:你永远不应该加密密码,并总是对它进行散列/加盐。想想有多少人为不同的服务使用相同的密码/电子邮件。因此,我得出结论,如果您需要加密一个项目,您应该使用单独的PIN或其他非必要项目。

但是,即使我要去引脚路线并保持密码散列,我仍然很好奇,你会如何理论去解决这个问题。

+4

不是一个居高临下的势利(我知道这些评论往往听起来像......提前抱歉),为什么你需要重新获得用户的密码?通常这表明设计缺陷应该以其他方式得到。 – corsiKa

+0

编辑 哈哈,没问题。基本上,我每天发送一次PDF到数据库中的所有用户。由于这包含不应共享的重要信息,因此我希望通过自己的密码对PDF进行密码保护。也许有另一种方式呢? 编辑:我还应该补充说,在网页上查看PDF并不总是可以的。 –

+1

@corsiKa居高临下的势利......这是个好问题 –

回答

3

是的,只要你保持SALT值的秘密。

更新:似乎人们不满意简单的答案。通过使用mcrypt扩展名,您可以使用特定的秘密值SALT加密数据。如果人们不知道SALT,他们不能解密价值。

例子:

<?php 
    define('SALT', 'whateveryouwant'); 

    function encrypt($text) 
    { 
     return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
    } 

    function decrypt($text) 
    { 
     return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
    } 
?> 

当然,如果你想额外的安全性,可以考虑使用公共密钥基础设施。

+1

出于好奇,因为我对加密知之甚少,还有哪些其他产品/服务在那里,为什么mcrypt是最好的选择?我不想浪费你的时间,但是如果你不介意的话,只是希望能快一两段。 –

+0

编辑答案 – Raptor

+0

Upvoted this。但是,对于OP,请记住,这对于站点密码来说不够安全。如果存储密码的系统受到危害,那么假设盐也被泄漏是安全的。 –