kan*_*der 17 php cryptography mcrypt
最近我开始在我的应用程序中使用加密技术,我发现自己对输入文本长度和它产生的密文之间的关系感到困惑.在应用加密之前,很容易确定数据库列大小.但是,现在,列大小略有不同.
两个问题:
对于奖励积分:我应该在varchar中存储base64编码的密文,还是将其保存为原始字节并将其存储在varbinary中?将数据存储在我的数据库中是否存在风险(我使用参数化查询,因此理论上意外断开转义应该不是问题)?
TIA!
补充:我使用的密码是AES/Rijndael-256 - 这种关系在可用算法之间有所不同吗?
Tho*_*nin 28
关系取决于您使用的填充和链接模式,以及算法块大小(如果它是块密码).
一些加密算法是流密码,它们"逐位"(或"逐字节")加密数据.它们中的大多数产生依赖于密钥的伪随机字节流,并且通过用该数据对该流进行异或(解密是相同的)来执行加密.使用流密码,加密长度等于普通数据长度.
其他加密算法是分组密码.块密码,名义上加密固定长度的单个数据块.AES是具有128位块(16字节)的分组密码.注意,AES-256也使用128位块; "256"是关键长度,而不是块长度.该链接模式是关于数据如何被分成几个这样的块(这是不容易牢固地做到这一点,但CBC模式是罚款).根据链接模式,数据可能需要一些填充,即在末尾添加一些额外的字节,以使长度适合于链接模式.填充必须使得在解密时可以明确地删除它.
对于CBC模式,输入数据必须具有块长度的长度倍数,因此通常添加PKCS#5填充:如果块长度为n,则添加至少1个字节,最多n个,这样total size是n的倍数,最后添加的字节(可能全部都是)具有数值k,其中k是添加的字节数.在解密时,查看最后解密的字节以恢复k并因此知道必须最终移除多少填充字节就足够了.
因此,对于CBC模式和AES,假设PKCS#5填充,如果输入数据具有长度d,则加密长度为(d + 16) & ~15.我在这里使用类似C的表示法; 用简单的话说,长度在d + 1和d + 16之间,以及16的倍数.
存在称为CTR(作为"计数器")的模式,其中块密码加密计数器的连续值,产生伪随机字节流.这有效地将分组密码转换为流密码,因此将长度为d的消息加密为d字节.
警告:关于所有加密系统(包括流密码)和模式需要一个称为IV(初始值)的额外值.每条消息都应有IV,并且没有两条使用相同密钥加密的消息应使用相同的IV.有些模式有额外的要求; 特别地,对于CBC和CTR,IV应随机且均匀地选择具有加密强度的伪随机数发生器.IV不是秘密,但必须由解密者知道.由于每条消息都有自己的IV,因此通常需要对IV和加密消息进行编码.对于CBC或CTR,IV的长度为n,因此,对于AES,这是额外的16个字节.我不知道mcrypt对IV做了什么,但是,从加密的角度来说,IV必须在某个时候进行管理.
至于Base64,它适用于通过纯文本媒体传输二进制数据,但这对于正确的数据库来说不是必需的.此外,Base64将数据扩大了约33%,因此不应盲目应用.我认为你最好在这里避免使用Base64.
| 归档时间: |
|
| 查看次数: |
16670 次 |
| 最近记录: |