Vbscript 使用对称密钥加密时无法使经典ASP参数化查询正常工作

Vbscript 使用对称密钥加密时无法使经典ASP参数化查询正常工作,vbscript,asp-classic,heidisql,Vbscript,Asp Classic,Heidisql,我在数据库上有密钥和证书设置ok,在直接使用HeidiSQL输入查询时可以加密ok。但是我遇到的问题是如何使用经典的asp。 我已经为测试设置了一个简单的表,其中包含一个自动增量标识列和一个用于保存加密数据的var binary max列 这是我的密码: chtest.commandtext="OPEN SYMMETRIC KEY SymmetricKey DECRYPTION BY CERTIFICATE [Certificate];" set rschtest = chtest.execu

我在数据库上有密钥和证书设置ok,在直接使用HeidiSQL输入查询时可以加密ok。但是我遇到的问题是如何使用经典的asp。 我已经为测试设置了一个简单的表,其中包含一个自动增量标识列和一个用于保存加密数据的var binary max列

这是我的密码:

chtest.commandtext="OPEN SYMMETRIC KEY SymmetricKey DECRYPTION BY CERTIFICATE [Certificate];"

set rschtest = chtest.execute

chtest.commandtext="INSERT into thetable(thevalue) values(?)"

chtest.Parameters.Append chtest.CreateParameter ("@thevalue", adVarBinary, adParamInput,8000, "EncryptByKey(Key_GUID('SymmetricKey'), 'some text here')"  )

set rschtest = chtest.execute
当二进制数据输入到表中时,这似乎起作用,但当直接在服务器上解密时,它只显示“Null”

直接在服务器上执行这些查询确实有效,例如:

通过证书打开对称密钥SymmetricKey解密
将值(EncryptByKey(Key_GUID('SymmetricKey'),'some text here')插入表中
然后

通过证书打开对称密钥SymmetricKey解密[证书]
选择CONVERT(varchar,DecryptByKey(thevalue))作为表中的值
工作并显示正确的解密值

我认为使用经典asp方法时的问题与必须将加密字符串作为varchar插入varbinary有关?或者类似的事情

另外,如果我不使用参数化查询,那么一切都正常,但显然我想使用准备好的查询来保证安全性

请注意,这是一个遗留应用程序,因此我必须使用经典的asp


非常感谢您的帮助。

您需要对
ADODB.Command
进行一些重构,此时
.CreateParameter()
调用毫无意义。您应该始终通过参数传递值的基本数据类型。之后的任何操作(在本例中是通过
EncryptByKey()
)都应该在
CommandText
定义的查询中完成

Dim sql:sql=“”
sql=sql&“通过证书[CERTIFICATE]打开对称密钥SymmetricKey解密”&vbCrLf
sql=sql&“将值(EncryptByKey(Key\u GUID('SymmetricKey'),?)插入表中”
用chtest
.ActiveConnection=您的\u连接\u字符串
.CommandText=sql
.CommandType=adCmdText
Call.Parameters.Append(.CreateParameter(@thevalue),adVarChar,adParamInput,8000,“此处的一些文本”)
'在执行插入时,请使用AdExecutenRecords来减少处理
提高绩效。
Set rschtest=chtest.Execute(,AdExecutenRecords)
以
你会注意到我变了

.CreateParameter(“@thevalue”,adVarBinary,adParamInput,8000,“EncryptByKey(Key\u GUID('SymmetricKey'),'some text here')”)

.CreateParameter(“@thevalue”,adVarChar,adParamInput,8000,“此处的一些文本”)
这是因为在本例中,当您操作基值时,字符串
'some text here'
对它的任何操作都需要在传递基值之外进行。
这就是为什么
.CommandText
现在包含
EncryptByKey(Key\u GUID('SymmetricKey'),?)
因此在执行过程中只有基值通过
参数
集合传递。

如果要参数化需要将其应用于传递的基值的值,则调用是完全错误的,因此
EncryptByKey(Key\u GUID('SymmetricKey'),…)之前的值是什么数据类型
?,在我看来是一个
varchar
字符串
'some text here'
@jzxz234没有问题,如果你想解密,你需要使用同样的原理,在
CommandText
中传递
DecryptByKey(?)
,然后这次参数将是二进制的,类似于
.CreateParameter(“@thevalue”、adVarBinary、adParamInput、8000、二进制值)
。答案的解释有点冗长,需要制定一种更清晰的方法来解释如何将基本数据类型传递到查询。