2014-01-15 1 views
0

암호 라이브러리를 사용하여 노드의 수준 암호화 데이터에 노력하고 있습니다.Node.js 암호 암호 특수 characeters

전 "가격 - 스미스"

확실하지 왜

function encrypt(data, key) { 
    if (data === null) 
     return null 
    else if (typeof data === 'undefined') 
     return undefined; 
    else if (data === '') 
     return ''; 

    var iv = crypto.randomBytes(16); 

    var cipher = crypto.createCipheriv('aes-256-cbc', key, iv); 
    cipher.update(data, 'utf8', 'binary'); 
    return Buffer.concat([iv, cipher.final()]).toString('base64'); 
} 

function decrypt(cipher, key) { 
    if (cipher === null) 
     return null 
    else if (typeof cipher == 'undefined') 
     return undefined; 
    else if (cipher === '') 
     return ''; 

    var cipher = new Buffer(cipher, 'base64'); 
    var iv = cipher.slice(0, 16); 
    var ciphertext = cipher.slice(16); 

    var decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); 
    decipher.update(ciphertext, 'binary', 'utf8'); 
    return decipher.final('utf8'); 
} 

오류

TypeError: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt 
at Decipheriv.Cipher.final (crypto.js:287:27) 
-

$ 같은 특수 문자를 제외하고 잘 작동하는 것 같다

각 필드 값에 별도의 IV가 사용됩니다. 그렇지 않으면 동일한 필드 값이 h 동일한 암호를가하십시오. 그래서 IV를 처음 16 바이트로 저장하고 암호 해독 전에 연결합니다. 어쩌면 이것이 내 문제 영역이 될 수 있을까?

감사합니다. Andrew

답변

1

이것은 아마도 사용 된 문자 유형이 아닌 일반 텍스트의 크기 때문일 수 있습니다. update()의 응답과 final()의 응답을 연결해야합니다. += 연산자는 사용하지 마십시오. does not always work on arrays입니다.

1

감사합니다. 다음은 작업 코드입니다.

function encrypt(data, key) { 
    if (data === null) 
     return null 
    else if (typeof data === 'undefined') 
     return undefined; 
    else if (data === '') 
     return ''; 

    var iv = crypto.randomBytes(16); 

    var cipher = crypto.createCipheriv('aes-256-cbc', key, iv); 
    var encrypted = [cipher.update(data)]; 
    encrypted.push(cipher.final()); 

    return Buffer.concat([iv, Buffer.concat(encrypted)]).toString('base64'); 
} 

function decrypt(cipher, key) { 
    if (cipher === null) 
     return null 
    else if (typeof cipher == 'undefined') 
     return undefined; 
    else if (cipher === '') 
     return ''; 

    var cipher = new Buffer(cipher, 'base64'); 
    var iv = cipher.slice(0, 16); 
    var ciphertext = cipher.slice(16); 

    var decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); 
    var decrypted = [decipher.update(ciphertext)]; 
    decrypted.push(decipher.final()); 

    return Buffer.concat(decrypted).toString('utf8'); 
}