Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 始终解密为纯文本的加密函数,即使密钥不正确_Javascript_Encryption_Cryptography_Aes_Cryptojs - Fatal编程技术网

Javascript 始终解密为纯文本的加密函数,即使密钥不正确

Javascript 始终解密为纯文本的加密函数,即使密钥不正确,javascript,encryption,cryptography,aes,cryptojs,Javascript,Encryption,Cryptography,Aes,Cryptojs,我正在开发一个javascript函数,使用6位PIN码在浏览器上加密和存储密码。虽然这很容易被强制执行,但服务器端代码通过在3次错误尝试后锁定帐户来防止这种情况 下面使用AES的示例仅在pin/密钥正确时解密为纯文本。这使得攻击者可以绕过服务器端限制,尝试999999组合并挑出唯一的纯文本结果 有人能推荐一个javascript加密函数/库,它总是解密为纯文本,即使使用的密钥不正确 var encrypted=CryptoJS.AES.encrypt(“密码:abcdefg”,“pin:12

我正在开发一个javascript函数,使用6位PIN码在浏览器上加密和存储密码。虽然这很容易被强制执行,但服务器端代码通过在3次错误尝试后锁定帐户来防止这种情况

下面使用AES的示例仅在pin/密钥正确时解密为纯文本。这使得攻击者可以绕过服务器端限制,尝试999999组合并挑出唯一的纯文本结果

有人能推荐一个javascript加密函数/库,它总是解密为纯文本,即使使用的密钥不正确

var encrypted=CryptoJS.AES.encrypt(“密码:abcdefg”,“pin:123456”);
$('#1')。文本(加密);
var decryptedCorrect=CryptoJS.AES.decrypt($('#1').text(),“pin:123456”)
$('#3').text(decryptedCorrect.toString(CryptoJS.enc.Utf8));
var decryptedInCorrect=CryptoJS.AES.decrypt($('#1').text(),“pin:112233”)
$('#4').text(decryptedInCorrect.toString(CryptoJS.enc.Utf8))

加密文本:

使用正确的pin解密:
使用不正确的pin解密:
(理想情况下,上面应该是一些纯文本值)
有保留格式的加密,可以直接回答您的问题。您可以查找库函数,但FPE并不常见。相反,您应该在开始解密/验证之前减少PIN重试计数器,然后在PIN解密且正确的情况下再次增加它


请注意,您的随意性方案无法替代TLS,并且可能存在其他漏洞。

一般来说,这是行不通的

为了防止像这样的暴力猜测攻击,不仅需要每个密钥(或至少相当大一部分密钥)将密文解密为有效的明文,而且还必须以某种方式安排每个密钥将密文解密为可信的明文,有足够的说服力,至少在粗略的检查中可以通过真正的明文

特别是,不正确加密产生的“假”明文至少需要在语法上有效,以便您自己的代码能够接受它,并且它还需要具有与真实明文相同的一般结构和统计特性,因此,攻击者不能仅仅使用一些正则表达式或字母频率分析来猜测哪些明文最有可能是正确的

基本上,如果要加密密码,解密方法必须为任何密钥生成看似合理的密码。如果要加密JSON数据,则必须生成有效的JSON。如果你对诗歌进行加密,它必须生成一首诗

它们必须是好诗,因为谁会费心加密坏诗呢

显然,没有通用加密算法可以做到这一点


那么,你如何才能实现你想要的东西呢?基本上,您有两种选择:

  • 您可以增加密钥的长度,使其无法实际枚举。如果您使用的是随机十进制数(实际上是随机选择的,不是由用户选择的!),那么25到30位数应该是最小的安全长度

    你可以用铅笔把长度缩短一点。例如,如果在使用结果解密数据之前将每个密钥散列100000次,则可以将密钥空间大小减少100000倍,即从25位减少到20位

    通过将密钥编码为短语,还可以使它们更容易记住。例如,您可以编译一个包含1000个简短的常用英语单词(or)的列表,并用列表中相应的单词替换密码中每组三位数的单词。对大多数人来说,记住一个由五个随机单词组成的序列要比记住一个随机的25位数容易得多

  • 当然,另一种选择是利用已有的服务器端速率限制。要做到这一点,您需要确保客户端必须先与服务器检查密钥,然后才能对其执行任何其他操作

    也就是说,您应该在服务器上存储实际的加密密钥(例如,可以是一个随机的128位二进制字符串),并且只有在客户机成功地使用其自己的“短密钥”进行身份验证后,服务器才会将其发送给客户机

    您还应确保窃听者无法捕获短密钥或长密钥,例如,使用类似的方式进行身份验证,或仅通过在网络上进行身份验证

  • 这两种解决方案都不是完美的:第一种方法可能需要很长的密钥,即使在密钥拉伸的情况下也不方便,而第二种方法在客户端脱机时无法工作,如果服务器遭到黑客攻击,可能会发生灾难性的故障。但总的来说,这些几乎是你能做到的最好的了


    (有几种方法可以将这两种方法结合起来以获得额外的安全性,因此攻击者必须同时破坏服务器和猜测客户端密码才能破坏系统。但是,这两种方法都有缺点。)

    你说的“总是解密为纯文本”是什么意思?根据定义,任何解密的结果都是纯文本。它可能不是正确的纯文本,但它仍然是正确的。请参见上面的代码示例,当它是错误的键时,它返回空值。我可以看到OP可能会出现的问题。如果攻击者尝试一个PIN,但它是错误的,它将总是产生一些字节输出,但这些字节将以压倒性的概率映射到作为标准字符集成员的字节,当且仅当使用的PIN是正确的。这是一种特殊的甲骨文,它会很快给出正确的密码。哦,恐怕我想不出任何强大的密码能满足你的需要。据我所知,每一个字节的所有256个可能的输出都是伪随机分布,并且不限于标准字符hanks@W