我正在建立一个网站的客户在其"仅限会员"部分使用密码/促销代码,使会员可以访问特殊内容。 我正在通过MySQL存储上述密码,并使用sha1进行了加密。
客户端需要在管理员控制面板中以纯文本格式查看这些密码。 显然,这不是使用sha1的选项。
与存储纯文本相比,在加密数据库中的密码时有何取舍? 我是否应该将它们简单地以纯文本格式存储在数据库中,然后在发布后加盐?
能够显示纯文本密码并保持适当安全级别的最佳方法是什么?
stackoverflow.com/questions/2283937/
您可以使用加密算法(而不是像sha1这样的哈希函数),它们是可逆的
我喜欢@DamienPirsy这个主意,尽管我对(自定义?)算法知之甚少。 我所说的"密码"将同时由多个成员使用,并通过邮件列表等发送出去。
不显示密码。只需为客户端提供以其他用户身份登录的功能(我想这就是他们需要密码的原因?),也许是在本身受仅客户端已知密码保护的页面上。
+1找出客户为什么要这么做,并为他们提供另一种做他们想做的事情的方法。他们不需要查看用户密码-也不应允许他们输入密码,因为这可能导致隐私权泄露到其他地方的客户帐户中。
客户创建促销代码,然后立即通过电子邮件发送给许多成员。该代码(密码)用于网站上以访问特殊内容。该密码必须通过管理控制面板可见,以供客户参考。
@mrtwidget我想您正在谈论完全独立于用户名/密码登录的内容。哇,那肯定需要更清楚一点,因为那根本不是密码。实际上,为什么要麻烦加密呢?
您应该向您的客户解释为什么他们必须无权访问密码。太多事情可能出错。流氓用户,被盗的数据库,错过了SQL注入攻击,认为这样做不值得冒险。
会员密码仅允许访问会员内容。没有敏感信息传递给常规成员。
不要这样查找替代路线。
如果您的客户出于任何原因想要查看其用户密码,请询问他们为什么要查看这些密码,以及如果他们拥有这些密码,他们会怎么做-然后为他们提供一种替代的直接方式,那就是涉及到必须知道用户密码是什么。
无论您的客户使用多么无辜,大多数人都在各处重复使用他们的密码。您的客户可能会认为他们仅知道自己系统的用户密码,但这意味着他们现在可能已经知道所有内容的用户密码-电子邮件,金融服务(例如网上银行)等。
它只需要一名恶意员工,并且用户的帐户就会在Internet上的其他地方遭到破坏。除了某人的隐私遭到侵犯之外,这可能完全是法律上的泥潭。
寻找替代品。永远不要以纯文本形式显示用户密码。
完全同意这个答案。另外,您应该更改为慢速密钥派生功能,例如BCrypt,SHA- *系列的算法对于散列密码而言太快了。
您可以使用两种方式加密来存储和显示密码。 mcrypt_encrypt()和mcrypt_decrypt。看看这个问题使用PHP的最简单的双向加密
可以做到的。
# --- ENCRYPTION ---
# the key should be random binary, use scrypt, bcrypt or PBKDF2 to # convert a string into a key # key is specified using hexadecimal $key = pack('H*',"bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
# show key size use either 16, 24 or 32 byte keys for AES-128, 192 # and 256 respectively $key_size = strlen($key);
echo"Key size:" . $key_size ."
";
$plaintext ="This string was AES-256 / CBC / ZeroBytePadding encrypted.";
# create a random IV to use with CBC encoding $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
# use an explicit encoding for the plain text $plaintext_utf8 = utf8_encode($plaintext);
# creates a cipher text compatible with AES (Rijndael block size = 128) # to keep the text confidential # only suitable for encoded input that never ends with value 00h # (because of default zero padding) $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
$plaintext_utf8, MCRYPT_MODE_CBC, $iv);
# prepend the IV for it to be available for decryption $ciphertext = $iv . $ciphertext;
# encode the resulting cipher text so it can be represented by a string $ciphertext_base64 = base64_encode($ciphertext);
echo $ciphertext_base64 ."
";
# === WARNING ===
# Resulting cipher text has no integrity or authenticity added # and is not protected against padding oracle attacks.
# --- DECRYPTION ---
$ciphertext_dec = base64_decode($ciphertext_base64);
# retrieves the IV, iv_size should be created using mcrypt_get_iv_size() $iv_dec = substr($ciphertext_dec, 0, $iv_size);
# retrieves the cipher text (everything except the $iv_size in the front) $ciphertext_dec = substr($ciphertext_dec, $iv_size);
# may remove 00h valued characters from end of plain text $plaintext_utf8_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key,
$ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
echo $plaintext_utf8_dec ."
";
?>
资料来源:http://www.php.net/manual/en/function.mcrypt-encrypt.php
它是使用SHA1存储的,因此由于SHA1是单向哈希,因此无法以明文形式检索。您不能将其转换为原始格式。
http://php.net/manual/en/function.sha1.php
因此,您既可以使用md5格式,也可以将它们简单地存储为纯文本格式,然后在发布后添加盐
md5也是单向的