Encryption ColdFusion用盐加密+;迭代,不工作

Encryption ColdFusion用盐加密+;迭代,不工作,encryption,coldfusion,Encryption,Coldfusion,这是一个函数,其中有变量名 encrypt(arguments.input, key, algorithm, encoding, arguments.salt, iterations) 我使用的是256位AES密钥,长度为44个字符 对于算法和编码,我选择了AES和base64 我试过各种方法来制造盐, createUUID(),generateScretKey('AES',128)和generateScretKey('AES',256) 每次salt更改时,对于相同的输入,加密的结果总是相同

这是一个函数,其中有变量名

encrypt(arguments.input, key, algorithm, encoding, arguments.salt, iterations)
我使用的是256位AES密钥,长度为44个字符

对于算法和编码,我选择了
AES
base64

我试过各种方法来制造盐,
createUUID()
generateScretKey('AES',128)
generateScretKey('AES',256)

每次salt更改时,对于相同的输入,加密的结果总是相同的。就像它忽略了它一样,没有错误来说明原因


我还注意到,迭代对加密也没有影响。

AES只支持三种密钥长度,16、24和32字节。请注意,44个字符是352位,而不是这些字符。但encrypt方法似乎希望使用Base64编码的字符串作为密钥,因此44个字符的Base64密钥似乎是正确的。文档没有详细说明密钥表单

还请注意,对于16字节的AES,iv(
arguments.salt
)的大小必须正好是一个块

有关更多信息,请参阅


有关更多帮助,请提供加密参数和结果。

AES仅支持三种密钥长度,即16、24和32字节。请注意,44个字符是352位,而不是这些字符。但encrypt方法似乎希望使用Base64编码的字符串作为密钥,因此44个字符的Base64密钥似乎是正确的。文档没有详细说明密钥表单

还请注意,对于16字节的AES,iv(
arguments.salt
)的大小必须正好是一个块

有关更多信息,请参阅

如需更多帮助,请提供加密参数和结果。

算法“AES”实际上是(即算法/模式/填充)。使用默认设置时,将忽略
iv
。使用手写算法表单指定CBC模式,即“AES/CBC/PKCS5P添加”

<cfscript>
for (i = 1; i <= 5; i++) {
    key = "ji3fd0ZKB87COPz5ZwqsQEQKcuRggtvvO98t3mZFxns=";
    // generate different iv's for DEMO only
    uuid = CreateUUID();
    iv = BinaryDecode( replace(uuid, "-", "", "all"), "hex");

    input = "This is plain text to be encrypted";
    encoding = "base64";
    algorithm = "AES/CBC/PKCS5Padding";

    encrypted = encrypt(input, key, algorithm, encoding, iv);
    decrypted = decrypt(encrypted, key, algorithm, encoding, iv);

    writeOutput("<hr>["& i &"] encrypted="& encrypted );
    writeOutput("<br>["& i &"] decrypted="& decrypted );
    writeOutput("<br>["& i &"] iv="& uuid );
}
</cfscript>

对于(i=1;i算法“AES”实际上是(即算法/模式/填充)。使用默认值时,
iv
将被忽略。使用手写算法表单指定CBC模式,即“AES/CBC/PKCS5P”

<cfscript>
for (i = 1; i <= 5; i++) {
    key = "ji3fd0ZKB87COPz5ZwqsQEQKcuRggtvvO98t3mZFxns=";
    // generate different iv's for DEMO only
    uuid = CreateUUID();
    iv = BinaryDecode( replace(uuid, "-", "", "all"), "hex");

    input = "This is plain text to be encrypted";
    encoding = "base64";
    algorithm = "AES/CBC/PKCS5Padding";

    encrypted = encrypt(input, key, algorithm, encoding, iv);
    decrypted = decrypt(encrypted, key, algorithm, encoding, iv);

    writeOutput("<hr>["& i &"] encrypted="& encrypted );
    writeOutput("<br>["& i &"] decrypted="& decrypted );
    writeOutput("<br>["& i &"] iv="& uuid );
}
</cfscript>


对于(i=1;如果我运行GenerateCretKey('AES',256),则为i)我得到一个44个字符的字符串,例如-ji3fd0ZKB87COPz5ZwqsQEQKcuRggtvvO98t3mZFxns=如果你说的是真的,我哪里出错了。还有“一个AES 256位密钥可以表示为一个包含64个字符的十六进制字符串。它需要base64中的44个字符。”uced是Base64字符串,encrypt需要Base64字符串。加密是基于字节的,而不是基于字符的,并且只支持字符的语言是一个问题。iv呢?文档中的详细信息不清楚是的,提供了更多的详细信息。(忽略过时的版本号,这些概念仍然适用).谢谢你的帮助,Zaph,Leigh已经强调了实际问题。但是如果我运行generatesecretkey('AES',256),关于盐的大小是16字节,你是对的我得到一个44个字符的字符串,例如-ji3fd0ZKB87COPz5ZwqsQEQKcuRggtvvO98t3mZFxns=如果你说的是真的,我哪里出错了。还有“一个AES 256位密钥可以表示为一个包含64个字符的十六进制字符串。它需要base64中的44个字符。”uced是Base64字符串,encrypt需要Base64字符串。加密是基于字节的,而不是基于字符的,并且只支持字符的语言是一个问题。iv呢?文档中的详细信息不清楚是的,提供了更多的详细信息。(忽略过时的版本号,这些概念仍然适用)。谢谢你的帮助,Zaph,Leigh已经强调了实际问题。但是你关于盐的大小是16 bytesThank你是对的,速记键“AES”就是问题所在。这也突出了我的新问题,IV-修复了!你所指的文档要好得多,糟糕的是,基本文档中没有链接到它。@Zaph-I知道吗?我记得在找到那篇文章之前,我在加密和搜索javadocs(CF的加密是基于javadocs的)方面苦苦挣扎了一段时间。一个简单的链接会有很大的帮助;-)@leigh你知道我应该如何在oracle中存储salt吗,我尝试将其创建为原始文件,但出现错误“ByteArray对象无法转换为字符串”,在SQL插入中也尝试了不带引号的方法,比如作为一个数字。@DanielCook-我不太使用Oracle。如果“原始”类型用于二进制尝试使用cfqueryparam和一个二进制cfsqltypes。这个旧的建议使用
CF\u SQL\u VARBINARY
。谢谢,简写键“AES”就是问题所在。这也突出了我的新问题,与IV-fixed一起使用!您指向的文档要好得多,糟糕的是,基本文档中没有指向它的链接@Zaph-我知道,对吧?我记得在找到那篇文章之前,我在加密和搜索javadocs(CF的加密是基于javadocs的)方面苦苦挣扎了一段时间。一个简单的链接会有很大帮助;-)@leigh你知道我应该如何在oracle中存储盐吗,我尝试将其创建为原始文件,但出现了错误“ByteArray对象无法转换为字符串”,在SQL插入中也尝试了不带引号的方法,例如作为数字。@DanielCook-我不太使用Oracle。如果“raw”类型用于二进制,请尝试将cfqueryparam与一个二进制CfSqlType一起使用。这一旧方法建议使用
CF\u SQL\u VARBINARY