2016-09-26 4 views
-1

Laravel의 암호화 모듈과 호환되는 해시를 만들려고합니다. https://github.com/illuminate/encryption/blob/master/Encrypter.php#L101-163 다음호환성 AES-256-CBC 노드/Laravel

내가 통해 올 한 것입니다 : 여기 Laravel의 참조 소스 코드 불행하게도

const encrypt = function (payload) { 
    const iv = crypto.randomBytes(16); 
    const key = new Buffer(config.stuff.key, 'base64'); 

    const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); 
    cipher.setAutoPadding(false); // With or without this /!\ 
    let value = cipher.update(serialize(JSON.stringify(payload)), 'utf8', 'base64'); 

    value + cipher.final('base64'); 

    const mac = crypto.createHmac('sha256', new Buffer(config.stuff.key, 'base64')).update(iv.toString('base64') + value).digest('hex'); 

    const json = JSON.stringify({ iv: iv.toString('base64'), value, mac }); 

    return base64_encode(json); 
}; 

, 나는 그 때 나는 BAD_DECRYPT 있습니다. 이것은 OpenSSL의 패딩에서 오는 것 같습니다. 누구나 아이디어가 있습니까?

+0

참고 : base64_encode가 있고 phpjs 및 기타 항목의 함수 유틸리티를 serialize합니다. – Extaze

답변

1

이 작동합니다 :

const encrypt = function (payload) { 
    const iv = crypto.randomBytes(16); 
    const key = new Buffer(config.stuff.key, 'base64'); 

    const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); 
    let value = cipher.update(serialize(payload), 'utf8'); 

    value = Buffer.concat([value, cipher.final()]).toString('base64'); 

    const mac = crypto.createHmac('sha256', key) 
      .update(iv.toString('base64') + value) 
      .digest('hex'); 

    const json = JSON.stringify({ 
     iv: iv.toString('base64'), 
     value: value, 
     mac: mac 
    }); 

    return base64_encode(json); 
}; 

문제를 :

  • openssl_encrypt하여도 자동 수행 된 PKCS # 7 패딩을 사용하고 Node.js를.
  • 첫 번째 두 문자열에 패딩 문자 (=)가 포함될 수 있으므로 여러 개의 Base64 문자열을 연결하여 Base64로 인코딩 된 단일 문자열을 만들지는 않습니다. 즉 이전 문자의 모든 비트가 실제로 암호문에 속하지는 않습니다. 그들 중 일부는 단지 더미 비트입니다. 이것이 Base64의 작동 방식입니다. here을 볼 때

PHP의 serizalize 자바 스크립트로 포팅 할 수 있습니다.

+0

serialize 및 기타 PHP 함수가 있음을 잊어 버렸습니다. 나는 당신의 해결책을 최대한 빨리 시도 할 것이다 – Extaze

+0

그것이 효과적이다, 굉장한. 유일한 것은'Buffer.concat ([value, cipher.final()])' – Extaze

+0

고마워요! 나는 보통 내가 실제로 대답으로 쓰는 것을 시도하지 않으며, 지금은 엉덩이에 나를 물었다.) –