2010-08-22 3 views
4

CF8 및 MySQL 5.1을 사용하여 로그인시 암호를 암호화 한 다음 암호 해독()하려고합니다. 테스트 페이지에서 제대로 작동하도록 decrypt()를 사용할 수 있지만 cflogin을 사용하여 cfincluded 페이지에 넣을 때 "다음과 같이 입력 문자열을 암호화하거나 해독하려고 시도하는 동안 오류가 발생했습니다 : com.rsa.jsafe.crypto .dr : 패딩을 수행 할 수 없습니다 : 유효하지 않은 패드 바이트 .. ". 내 테스트 페이지에서 내 앱까지 동일한 코드 및 DB입니다."언 패딩을 수행 할 수 없습니다 : 유효하지 않은 패드 바이트 .."에 대한 암호 해독 오류.

application.cfc :

<cfif NOT IsDefined("Request.PasswordKey")> 
<cfset request.PasswordKey = generateSecretKey("AES")> 
<cfset request.algorithm = "AES"> 
<cfset request.encoding = "hex"> 
</cfif> 

테스트 페이지 잘 작동 :

FORM DATA: <br/> 
form password:<cfoutput>#form.passwd#</cfoutput><br/> 
<cfset encrypted = Encrypt(form.passwd,Request.PasswordKey,Request.algorithm,Request.encoding)> 
Encrypted: <cfoutput>#encrypted#</cfoutput><br/> 
Decrypted: <cfoutput>#Decrypt(variables.encrypted,Request.PasswordKey,Request.algorithm,Request.encoding)#</cfoutput><br/> 
<br/> 
QUERY DATA<br/> 
<cfinvoke component="components.userQ" method="login" returnvariable="qLogin"> 
<cfinvokeargument name="formData" value="#form#"> 
</cfinvoke> 
<cfoutput>qLogin password: #qlogin.encPasswd#</cfoutput><br/> 
<cfoutput>Decrypted encPasswd from qLogin: #Decrypt(qlogin.encPasswd,Request.PasswordKey,Request.algorithm,Request.encoding)#</cfoutput> 

해독()를 앱 페이지에 erroring되는 :

<cfset unEnPasswd = #Decrypt(qlogin.encPasswd,Request.PasswordKey,Request.algorithm,Request.encoding)#> 

내가 기본을 얻을 수 있습니다 CFMX_COMPAT는 동일한 코드로 내 앱에서 올바르게 작동하도록 encrypt() 및 decrypt()를 수행하고 키, 알고리즘 및 인코딩을 변경합니다. 변수들.
BTW, 나는 DB에 varchar()로 암호화 된 문자열을 저장하므로 패딩을 엉망으로 만들지 않습니다. BLOB를 시도했지만 bytearray 오류가 발생합니다.

어떤 도움이나 생각이라도 대단히 감사합니다. 당신은 모든 요청에 ​​대한 새로운 비밀 키를 만들

답변

4

, 더 같이

정말 코드가 있어야한다 : 정말 비록 당신이 그렇지 않으면 설정 파일에 하드 코드 된 암호 키를 갖고 싶어

<cffunction name="onApplicationStart" returnType="boolean" output="false"> 
    <cfset application.PasswordKey = generateSecretKey("AES")> 
</cffunction> 

<cffunction name="onRequestStart" returnType="boolean" output="false"> 
    <cfset request.PasswordKey = application.PasswordKey /> 
    <cfset request.algorithm = "AES" /> 
    <cfset request.encoding = "hex" /> 
</cffunction> 

서버를 다시 시작하면 다시 어떤 암호에도 액세스 할 수 없습니다.

+0

정말 중요한 점은 두 개의 서로 다른 페이지에서 키와 암호화 된 문자열을 cfdump 할 때 모두 동일하다는 것입니다. 따라서 db에 저장하기 전에 암호화 된 문자열은 나중에 db에서 가져온 문자열과 동일해야합니다. 그리고 매번 사용하는 열쇠는 동일해야합니다. –

+0

죄송합니다 - 귀하의 답변을 이해하기 시작하고 나는 다른 열쇠를 사용하고 있다고 생각합니다. 그래서 바보 같은 질문을한다. AES 용 generateSecretKey()를 사용하여 다시 시작시 같은 키를 사용하고 있는지 확인하려면 어떻게해야합니까? –

+0

개인적으로 저는 실제로 응용 프로그램에 대해 하나의 고유 한 키를 생성합니다. 그런 다음이 키는 응용 프로그램에서 하드 코딩됩니다 (구성 파일에 저장 됨 - 전체 상수를 보유하는 cfm 만). 즉, 서버의 어딘가에 키 사본을 가지고 있어야한다는 것을 의미합니다. 그러나 그에 관해 할 수있는 일은별로 없습니다. –

0

jsafe를 사용하지 않도록 설정하십시오. jvm 구성에 -Dcoldfusion.disablejsafe = true를 추가하십시오.

관련 문제