Cookies RIJNDAEL加密是否可以安全地用于提供给用户的少量文本?

Cookies RIJNDAEL加密是否可以安全地用于提供给用户的少量文本?,cookies,encryption,cryptography,rijndael,Cookies,Encryption,Cryptography,Rijndael,我正在考虑切换到将会话数据存储在加密的cookie中,而不是存储在服务器上的某个地方。虽然这将导致每个请求使用更多的带宽,但它将节省额外的数据库服务器负载和存储空间 无论如何,我计划用256加密cookie内容 使用中会产生类似的结果(base64编码用于显示) 我并不担心单个用户的cookie被破坏,因为我担心攻击者会发现密钥,并能够为任何用户构建任何会话,因为他们知道我使用什么来签署数据 是否有办法验证与所用参数相关的预计开裂时间?或者是否有与所用文本或键的大小相关的标准时间度量? 我听到有

我正在考虑切换到将会话数据存储在加密的cookie中,而不是存储在服务器上的某个地方。虽然这将导致每个请求使用更多的带宽,但它将节省额外的数据库服务器负载和存储空间

无论如何,我计划用256加密cookie内容

使用中会产生类似的结果(base64编码用于显示)

我并不担心单个用户的cookie被破坏,因为我担心攻击者会发现
密钥
,并能够为任何用户构建任何会话,因为他们知道我使用什么来签署数据

是否有办法验证与所用参数相关的预计开裂时间?或者是否有与所用文本或键的大小相关的标准时间度量?

我听到有人说钥匙本身需要超过256比特才能安全地与RIJNDAEL一起使用。我还想知道加密文本的长度是否需要为某个长度,以便不泄露密钥

数据通常约为200个字符

a:3{s:7:"user_id";i:345;s:5:"token";s:32:"0c4a14547ad221a5d877c2509b887ee6";s:4:"lang";s:2:"en";}

这安全吗?

Rijndael被重命名为AES。是的,使用起来很安全

那就说,你应该仔细考虑你把饼干放进去了。这取决于系统上可用的存储方式,但您可以简单地选择一个随机数(比如64位数字),并将其存储在cookie中。在您的服务器端系统中,您将保留该号码与谁关联的记录以及其他详细信息。这完全避免了加密。您可以使用其他详细信息来验证(在任何可以验证的范围内)cookie是否从最初发送到的浏览器发回

或者,您可以为每个会话使用不同的加密密钥,跟踪哪个密钥用于哪个会话


即使你用一个固定的密钥进行直接加密,考虑将一个随机数加上要加密的数据——这使得使用已知明文攻击更难破解,因为根据定义,随机数是不可知道的。< /P> < P>避免使用ECB。它可以透露有关加密内容的信息。具有相同明文的任何两个块将具有相同的密文。CBC可以避免这种情况,但需要生成或保存IV

避免简单地保存密钥和IV。使用加密强随机数生成器生成256位主密钥,并将其保存到应用程序中安全的地方。使用它生成用于加密的会话密钥。IV可以从会话密钥派生。生成会话密钥时,请包含可用于缩小会话密钥范围的任何和所有可用数据。(例如,包括cookie的范围、远程主机地址、与加密数据一起存储的随机名称和/或用户ID(如果不在加密数据内)

根据数据的使用方式,您可能必须包括MAC。ECB和CBC的设计目的不是检测密文的任何更改,这种更改将导致明文中的垃圾。您可能希望在加密数据中包含HMAC,以便在将其作为佳能之前对其进行身份验证。会话HMAC密钥必须从会话加密密钥派生。或者,您可以使用PCBC模式。PCBC用于检测密文中的变化,但其检测能力受到填充大小的限制,这取决于加密的数据,并非所有加密API都将其作为选项

一旦你已经包括了一个Mac,那么你应该考虑采取措施防止重放攻击。任何时候有人可以在会话范围内重新发送旧数据都有可能遭受重播攻击。使会话密钥的使用范围尽可能窄而不会给用户带来问题是阻止重播攻击的一种方法。您可以做的另一件事是在加密数据中包含日期和时间,以便在数据被视为有效时创建一个窗口


总之,保护密钥只是冰山一角。

AES-128应该足够了,不需要使用更长的密钥-如果密钥是随机选择的

然而,还有其他问题。首先,你不应该使用ECB。对于ECB,如果密钥相同,则给定的128位明文块始终映射为相同的128位密文。这意味着对手可以通过外科手术修改密文,注入他们知道相应密文的不同块。例如,他们可以混合两个不同用户的数据。对于其他模式,例如CBC是可以的,密文也取决于IV(初始化向量),它在算法的每次执行时都应该是不同的。这样,相同的明文每次加密都不同,对手无法获得任何优势。你还需要用密文把IV保存在某个地方,不需要保护它。当重复使用同一个IV的机会变得不可忽略时,您也应该更换钥匙


第二个问题是,还应该附加消息身份验证代码。否则你将无法区分伪造的饼干和好的饼干

如果你用一把长钥匙,我会说这把钥匙很安全。你需要关注的一些事情:

您正在将数据存储卸载到客户端。永远不要相信客户。这并不意味着您不能这样做,只是您必须将cookie中的数据视为不受信任的数据(不要做出比基于它向用户显示什么“主题”更严重的决定),或者提供一种验证数据的方法

如何验证数据的一些示例包括:

  • 包括一个salt(这样具有相同会话数据的人就不会得到相同的cookie)和
  • 校验和(以便
    print base64_encode(encrypt('text', 'key'));
    
    7s6RyMaYd4yAibXZJ3C8EuBtB4F0qfJ31xu1tXm8Xvw=
    
    a:3{s:7:"user_id";i:345;s:5:"token";s:32:"0c4a14547ad221a5d877c2509b887ee6";s:4:"lang";s:2:"en";}