我目前正在实现一个简单的基于RSA的加密,如下所示(使用openssl_public_encrypt):
// sRawText is the text string to encrypt.
// #qcStackCode#sPublicKey is the public key stored on the server.
openssl_public_encrypt(sRawText, #qcStackCode#sResult, sPublicKey, OPENSSL_PKCS1_OAEP_PADDING);
// #qcStackCode#sResult is the encrypted result which is then stored.我确保使用OAEP填充选项,但是填充是用SHA1而不是SHA256完成的。PHP没有支持SHA256的内置填充选项。例如,Python的密码库使用SHA256,如下所示:
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
ciphertext = public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)要在PHP上获得SHA256,唯一的选择是使用第三方库,比如PHPSecLib或EasyRSA。几个小时后,我在共享的托管环境中安装和使用它们中的任何一个后,我遇到了一些障碍。(如果我能够将一个.php文件放在一个位置上,这将是理想的。)
数据被加密到在线服务器上的数据库中,这必须发生在PHP中,这样我就可以在用户注册时插入新条目(使用公钥)。我想确保,如果加密的数据库数据和公钥落入了邪恶之手,并访问了合理水平的计算能力,这些数据将保持私有(就像暴力攻击一样安全)。不法分子手中的数据可能被滥用于欺骗用户或制造欺诈性的虚假索赔。
客户端存储无法工作,因为数据目前已经在数据库中,我需要某些字段,例如联系人信息,以便与用户联系。另外,我认为大多数客户都会丢失数据,这些数据是无法恢复的,需要在几年内仍然可以使用。但是,我不希望完全信任服务器环境,因此我希望将攻击面最小化到使用数据时的特定时刻。对于我来说,保持私钥和传递短语的离线和安全比保护动态数据库要容易得多,动态数据库不断变化,需要冗余存储。
我计划离线对加密数据进行所有操作,并且只使用加密的数据库字段进行验证(即数据与用户输入的内容匹配)或计数条目。数据库中的一些字段是不敏感的,所以它们没有加密,还有一些像密码这样的字段被散列。
我想知道的是,如果我继续进行SHA1填充实现,这会使我面临什么样的攻击,以对抗使用加密的数据库数据和公钥的对手。他们会怎么处理这些袭击?SHA256填充是否有助于更好地保护数据,以及如何保护?
非常感谢!
发布于 2021-12-13 23:13:05
您可以将SHA-1或MD5用于OAEP。它不会让你受到任何攻击。
OAEP将哈希函数用于两种情况:对标签进行散列,并将其作为掩码生成函数的一部分,在实践中,它始终是某些哈希函数的MGF1。
对于标签,哈希函数仅用于将标签转换为密文域分隔符:解密时,带有错误标签散列的密文被检测为无效。只要你不从对手提供的部件中构建标签,你就不会有碰撞的危险。如果您确实以一种复杂的方式构建标签,并且您依赖于它的安全性,那么您可能无论如何都应该有一个签名。
对于MGF1,哈希函数用作随机预言。它作为散列的属性与此无关。前流行的散列函数已被废弃,因为对它们的属性进行了具体的哈希函数攻击(具体来说,就是防碰撞)。然而,作为随机的先知,他们仍然被认为是好的。(它们有一个已知的缺陷,即长度扩展,也适用于没有已知缺陷的SHA2作为散列函数。但是OAEP中的长度扩展并不适用于MGF1,因为它用于给定的RSA密钥的固定大小输入。)
在密码结构中使用SHA-1可能会使审计师皱眉,而且会使您的系统不符合某些安全标准。就安全性而言,这有点让人分心,但不是一个漏洞。
https://crypto.stackexchange.com/questions/96621
复制相似问题