我想加密可能只有大约三个或四个字符但运行到大约二十个字符的字符串。散列函数(md5、sha1、crypt等)不适合,因为我也希望能够解密信息。mcrypt扩展有一系列令人生畏的可能性。
有没有人对安全加密短字符串的最佳方法有任何想法,为什么?有没有人链接到任何将临时程序员介绍给实际加密场景的材料?
我喜欢将 GnuPG 用于任何需要在服务器上加密然后可能在服务器或另一台服务器上解密的东西(这通常是我的情况)。这允许额外的安全级别,因为在我的场景中,加密服务器没有解密数据的密钥。它还允许更轻松的手动解密。有一些很好的包装器可用于各种语言(另一个优点),用于 PHP 的包装器是GnuPGP PHP Class。
默认情况下, mcrypt链接到大多数 PHP 版本。它包含您可能需要的所有原语。如果不了解更多关于您正在加密什么、您的威胁模型是什么等信息,就很难就使用什么算法、操作模式等给出具体建议。
我可以肯定地说:对于短文本字符串,您必须使用唯一的随机初始化向量比以往任何时候都更加重要。否则,有人对加密数据进行各种攻击是微不足道的。
我强烈推荐Chris Kite的建议。如果不了解更多关于您在做什么、为什么以及您预期需要防范 AES-128 的威胁可能就足够了。使用对称加密的能力非常适合作为数据解密器和加密器的独立应用程序。正如Chris Kite和Arachnid所说,由于数据量小,建议您填充数据并使用随机初始化向量。
更新:至于为什么......直到捕获的密文。简而言之,这就是彩虹表的工作方式。
现在,如果您要在一台服务器上加密并在另一台服务器上解密,我会接受pdavis的建议。通过使用非对称方法,您可以将加密密钥与解密密钥分开。这样,如果加密数据的服务器被攻破,攻击者仍然无法解密数据。
如果可以的话,它将帮助社区更多地了解您的加密用例。正如我上面提到的,在评估安全控制时,正确理解可能的威胁是关键。
是否有人可以解密它有关系吗? 如果您只是想稍微混淆一下,请使用 ROT13。这是老学校。
如果您想在应用程序中加密和解密数据,您很可能希望使用对称密钥密码。AES 是美国国家安全局认证的用于保护绝密数据的对称块加密算法,是您的最佳选择。www.phpaes.com上有一个纯 PHP 实现
对于您的使用,听起来 AES128 就足够了。您将希望将 CBC 模式与随机初始化向量一起使用,否则相同的数据将始终产生相同的密文。
选择正确的加密算法是很好的第一步,但是对于一个安全系统来说,有很多因素很难做到正确,例如密钥管理。那里有很好的资源,例如 Bruce Schneier 的 Applied Cryptography 和 Ross Anderson 的 Security Engineering(可在线免费获得)。
我同意 Chris Kite - 只需使用 AES 128,这就足够了。
我不确切地知道你的环境,但我猜你正在通过互联网以某种方式传输数据。
不要使用 ECB,这对于相同的纯文本总是会产生相同的结果。
CBC 模式是要走的路,不要忘记随机初始化向量。该向量必须与密文进行通信,并且可以明文发送。
关于您的数据,由于 AES 是块密码,因此结果始终是块大小的倍数。如果您不想让观察者知道您的数据是短还是长,请添加一些填充以将其扩展到最大预期大小。
我猜任何单向加密算法(例如 Blowfish)都可以。河豚又快又开放。您可以通过 crypt() 函数使用 Blowfish。AFAIK 没有加密算法特别适用于小字符串。不过要注意的一件事是,暴力破解如此小的字符串将非常容易。也许您应该加密字符串以及“秘密”盐值以提高安全性。
您可以使用一般的编程思想而不依赖内置的加密/解密函数示例创建一个函数调用它
function encryptstring($string) {
$string_length=strlen($string);
$encrychars="";
/**
*For each character of the given string generate the code
*/
for ($position = 0;$position<$string_length;$position++){
$key = (($string_length+$position)+1);
$key = (255+$key) % 255;
$get_char_to_be_encrypted = SUBSTR($string, $position, 1);
$ascii_char = ORD($get_char_to_be_encrypted);
$xored_char = $ascii_char ^ $key; //xor operation
$encrypted_char = CHR($xored_char);
$encrychars .= $encrypted_char;
}
/**
*Return the encrypted/decrypted string
*/
return $encrychars;
}
在带有链接的页面上包含需要加密的 id
/**
*While passing the unique value to a link
*Do the following steps
*/
$id=57;//or if you are fetching it automatically just pass it here
/**
*For more security multiply some value
*You can set the multiplication value in config file
*/
$passstring=$id*346244;
$encrypted_string=encryptstring($passstring);
$param=urlencode($encrypted_string);
/**
*Derive the url for the link
*/
echo '<a href="target_file.php?aZ98#9A_KL='.$param.'">something</a>' ;
在单击链接后打开的目标文件上
/**
*Retriving the value in the target file
*Do the following steps
*/
$fetchid=$_GET['aZ98#9A_KL'];
$passstring=urldecode(stripslashes($fetchid));
$decrypted_string= encryptstring($passstring);
/**
*Divide the decrypted value with the same value we used for the multiplication
*/
$actual_id= $decrypted_string/346244;