问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

JS判断字符串是否加密的多种方法

创作时间:
作者:
@小白创作中心

JS判断字符串是否加密的多种方法

引用
1
来源
1.
https://docs.pingcode.com/baike/3927005

核心观点

通过正则表达式匹配常见加密模式、检测字符串的随机性、检查字符串长度、使用已知的加密算法进行解密尝试、查看字符串是否包含特定的标记或前缀。其中,使用正则表达式匹配常见加密模式是一种较为直接且高效的方法。常见的加密字符串通常会有特定的格式,例如Base64编码的字符串往往以特定的字符集组成,并且长度是4的倍数。通过预先设定的正则表达式,可以快速判断字符串是否符合这些特征。这样可以在不进行复杂计算的前提下,初步筛选出可能被加密的字符串。

通过正则表达式匹配常见加密模式

正则表达式是一种强大的工具,能用于匹配字符串的特定模式。对于常见的加密模式,例如Base64编码、十六进制编码等,可以通过正则表达式进行快速判断。

Base64编码的正则表达式:

const base64Pattern = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
const isBase64 = base64Pattern.test(yourString);

十六进制编码的正则表达式:

const hexPattern = /^[0-9a-fA-F]+$/;
const isHex = hexPattern.test(yourString);

通过这些正则表达式,可以快速筛选出可能被加密的字符串。

检测字符串的随机性

加密字符串通常具有高随机性。可以通过计算字符串的熵来判断其随机性。熵越高,字符串越可能是加密的。熵的计算涉及统计字符串中各字符的频率,然后根据这些频率计算熵值。

function calculateEntropy(str) {
    const len = str.length;
    const frequencies = {};
    for (let i = 0; i < len; i++) {
        const char = str[i];
        frequencies[char] = (frequencies[char] || 0) + 1;
    }
    let entropy = 0;
    for (const char in frequencies) {
        const p = frequencies[char] / len;
        entropy -= p * Math.log2(p);
    }
    return entropy;
}
const entropy = calculateEntropy(yourString);

如果字符串的熵值非常高,则可能是加密字符串。

检查字符串长度

加密后的字符串通常长度较长且具有特定的长度特征。例如,AES加密后的数据长度通常是16的倍数,Base64编码后的字符串长度是4的倍数。因此,通过检查字符串长度是否符合这些特征,也可以判断字符串是否被加密。

const isAESLength = (yourString.length % 16 === 0);
const isBase64Length = (yourString.length % 4 === 0);

使用已知的加密算法进行解密尝试

如果你有一些常见的加密算法和密钥,可以尝试对字符串进行解密。如果解密成功,说明字符串是加密的。

const crypto = require('crypto');
function decryptAES(encryptedText, key) {
    const decipher = crypto.createDecipher('aes-256-cbc', key);
    let decrypted = decipher.update(encryptedText, 'base64', 'utf8');
    decrypted += decipher.final('utf8');
    return decrypted;
}
try {
    const decryptedText = decryptAES(yourString, yourKey);
    console.log('Decrypted text:', decryptedText);
} catch (error) {
    console.log('Failed to decrypt, possibly not encrypted.');
}

查看字符串是否包含特定的标记或前缀

一些加密算法会在加密后的字符串中添加特定的标记或前缀。例如,JWT(JSON Web Token)通常包含三部分,用点号(.)分隔。通过检查这些特定标记或前缀,可以快速判断字符串是否加密。

const isJWT = yourString.split('.').length === 3;

综合判断

在实际应用中,可以结合上述方法进行综合判断。不同的场景和需求可能需要不同的判断策略。

function isEncryptedString(str) {
    const base64Pattern = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
    const hexPattern = /^[0-9a-fA-F]+$/;
    if (base64Pattern.test(str) || hexPattern.test(str)) {
        return true;
    }
    const entropy = calculateEntropy(str);
    if (entropy > someThreshold) {
        return true;
    }
    if (str.length % 16 === 0 || str.length % 4 === 0) {
        return true;
    }
    if (str.split('.').length === 3) {
        return true;
    }
    try {
        const decryptedText = decryptAES(str, yourKey);
        return true;
    } catch (error) {
        return false;
    }
}

通过上述方法,可以有效判断字符串是否被加密。希望这些方法和代码示例能帮助你在实际项目中解决相关问题。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号