목차
JAVASCRIPT 客户端加密 PHP服务端解密
Jun 06, 2016 pm 08:51 PM
javascript
php
암호화
암호 해독
hi 大家好.
我用 crypto-js 在客户端加密:
function encrypt(str) { var key = $.cookie('key'); var encrypted = CryptoJS.TripleDES.encrypt(str, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.ZeroPadding}); return encrypted; }
로그인 후 복사
로그인 후 복사
服务端:
$decrypt = mcrypt_decrypt (MCRYPT_3DES, $_SESSION['key'], $encrypted_str_from_client, MCRYPT_MODE_ECB); print ($decrypt);
로그인 후 복사
로그인 후 복사
这样子无法解密.
请问大家有没有办法做到在客户端 用3DES ECB模式加密,后端能够解密的?
回复内容:
hi 大家好.
我用 crypto-js 在客户端加密:
function encrypt(str) { var key = $.cookie('key'); var encrypted = CryptoJS.TripleDES.encrypt(str, key, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.ZeroPadding}); return encrypted; }
로그인 후 복사
로그인 후 복사
服务端:
$decrypt = mcrypt_decrypt (MCRYPT_3DES, $_SESSION['key'], $encrypted_str_from_client, MCRYPT_MODE_ECB); print ($decrypt);
로그인 후 복사
로그인 후 복사
这样子无法解密.
请问大家有没有办法做到在客户端 用3DES ECB模式加密,后端能够解密的?
<?php session_start(); /** PBKDF2 Implementation (as described in RFC 2898); * * @param string p password * @param string s salt * @param int c iteration count (use 1000 or higher) * @param int kl derived key length * @param string a hash algorithm * * @return string derived key */ function pbkdf2_helper_for_javascript( $p, $s, $c, $kl, $a = 'sha256' ) { $hl = strlen( hash( $a, null, true ) ); $kb = ceil( $kl / $hl ); $dk = ''; for ( $block = 1; $block <= $kb; $block++ ) { $ib = $b = hash_hmac( $a, $s . pack( 'N', $block ), $p, true ); for ( $i = 1; $i < $c; $i++ ) { $ib ^= ( $b = hash_hmac( $a, $b, $p, true ) ); } $dk .= $ib; } return substr( $dk, 0, $kl ); } function dectypt_from_javascript_encrypt($dectypted_str, $callback = null) { $salt = $_SESSION['password_salt']; $secret_key = $_SESSION['password_secret']; //get the cipher key $key = pbkdf2_helper_for_javascript( $secret_key, $salt, 1000, 32 ); //get the IV $iv64 = $_REQUEST['iv']; $iv = base64_decode($iv64); //get the HMAC $hmac = $_REQUEST['hmac']; # initialise mcrypt. NB Rijndael-128 covers all variants of AES $td = mcrypt_module_open( MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_NOFB, '' ); # do encryption $input = base64_decode($dectypted_str); mcrypt_generic_init($td, $key, $iv); $plain = mdecrypt_generic($td, $input); mcrypt_generic_deinit($td); # shutdown mcrypt mcrypt_module_close($td); # create HMAC for message $hmacActual = hash_hmac('sha256', $plain, $iv); if($hmac == $hmacActual) { if ($callback && is_callable($callback)) { $callback('success', $plain); } } else { //解密失败,提示提醒用户 $callback('error', null); } //session 用完后清除 $_SESSION['password_secret'] = null; } if ($user = @$_POST['user'] && $password = @$_POST['password']) { dectypt_from_javascript_encrypt($_POST['password'], function ($status, $password) { print $password; }); } // 每次发生请求,生成一次key用来解密. $key = uniqid(); //发送到客户端cookie setcookie("password_secret", $key, 0); setcookie("password_salt", "tuding_salt"); //并且保存到session用来后续的解密 $_SESSION['password_secret'] = $key; $_SESSION['password_salt'] = 'tuding_salt'; ?> <meta charset="utf-8"> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> <script type="text/javascript" src="http://crypto-js.googlecode.com/files/2.5.3-crypto.js"></script> <script type="text/javascript" src="http://crypto-js.googlecode.com/files/2.5.3-sha256.js"></script> <script type="text/javascript" src="http://crypto-js.googlecode.com/files/2.3.0-hmac.js"></script> <script type="text/javascript" src="http://crypto-js.googlecode.com/files/2.3.0-pbkdf2.js"></script> <script type="text/javascript" src="http://crypto-js.googlecode.com/files/2.3.0-aes.js"></script> <script type="text/javascript" src="http://crypto-js.googlecode.com/files/2.5.3-blockmodes.js"></script> <script type="text/javascript"> function doEncrypt(message) { var secret = $.cookie('password_secret'); var salt = $.cookie('password_salt'); var bytes_iv = Crypto.util.randomBytes(16); var base64_iv = Crypto.util.bytesToBase64(bytes_iv); var hmac = Crypto.HMAC(Crypto.SHA256, message, bytes_iv); var key = Crypto.PBKDF2(secret, salt, 32, {hasher:Crypto.SHA256, iterations:1000, asBytes:true}); var cipher =Crypto.AES.encrypt(message, key, {iv:bytes_iv, mode:new Crypto.mode.OFB, asBytes:false}); return {iv: base64_iv, hmac: hmac, cipher: cipher}; } $(document).ready(function () { $('#submit').click(function () { var user = $('input[name="user"]').val(); var pwd = $('input[name="password"]').val(); try { var encrypt_pwd = doEncrypt(pwd); $('input[name="hmac"]').val(encrypt_pwd['hmac']); $('input[name="password"]').val(encrypt_pwd['cipher']); $('input[name="iv"]').val(encrypt_pwd['iv']); } catch (exception) { //TODO: } }); }); </script>
로그인 후 복사
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

인기 기사
스플릿 소설을이기는 데 얼마나 걸립니까?
3 몇 주 전
By DDD
Repo : 팀원을 부활시키는 방법
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
헬로 키티 아일랜드 어드벤처 : 거대한 씨앗을 얻는 방법
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌

인기 기사
스플릿 소설을이기는 데 얼마나 걸립니까?
3 몇 주 전
By DDD
Repo : 팀원을 부활시키는 방법
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
헬로 키티 아일랜드 어드벤처 : 거대한 씨앗을 얻는 방법
3 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 주 전
By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제
Gmail 이메일의 로그인 입구는 어디에 있나요?
7142
9


자바 튜토리얼
1534
14


라라벨 튜토리얼
1257
25


PHP 튜토리얼
1205
29


Cakephp 튜토리얼
1155
46



Ubuntu 및 Debian용 PHP 8.4 설치 및 업그레이드 가이드

PHP 개발을 위해 Visual Studio Code(VS Code)를 설정하는 방법
