- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 crypto-Js AES 的应用程序。模拟工作代码为:
var ciphertext = CryptoJS.AES.encrypt('My_message', 'My_secret_key');
console.log(ciphertext.toString());
答案是:
U2FsdGVkX1/Dd3uAr/mdw5lVoBvq0UX5LHnNoX24JAM=
当我尝试在服务器端重现它时,我从来没有得到相同的答案:
$passphrase='My_secret_key';
$value='My_message';
$salt = openssl_random_pseudo_bytes(8);
$salt ='';
$salted = '';
$dx = '';
while (strlen($salted) < 48) {
$dx = md5($dx.$passphrase.$salt, true);
$salted .= $dx;
}
$key = substr($salted, 0, 32);
$iv = substr($salted, 32,16);
$encrypted_data = openssl_encrypt($value, 'aes-256-cbc', $key, true, $iv);
echo base64_encode($encrypted_data);
服务器端回答:
3jSTl1yR55lfTbz7f0o3Yw==
我一定错过了什么,但不能指出是什么。本地端不能碰。欢迎所有帮助
最佳答案
如果 CryptoJS.AES.encrypt
中的第二个参数作为字符串传递,它被解释为密码短语,实际 key 和 IV 从中导出,[1] .这是通过使用迭代计数为 1
的 OpenSSL 函数 EVP_BytesToKey
和 MD5 摘要 [2] 的功能来实现的。 [3] (请注意,CryptoJS 不考虑从 OpenSSL 版本 1.1.0c 将默认摘要从 MD5 切换到 SHA256,[4])。
CryptoJS.AES.encrypt
返回一个 CipherParams
对象,它封装了密文、 key 、IV 和盐,[5] .此外,CipherParams#toString()
以 Base64 编码字符串的形式返回 OpenSSL 格式的结果。 OpenSSL 格式由一个 16 字节的 header 和随后的密文组成。 header 以 ASCII 编码的字符串 Salted__
开头,后跟一个 8 字节的盐。 salt 每次随机生成,并与密码一起用于派生 key /IV。这每次都会创建一个不同的 key /IV。
PHP 代码在功能上是相同的: key 和 IV 是从密码短语中每次使用新生成的盐的模拟逻辑导出的(有关证明,请参见下文)。然而,一些小的改变是必要的:
必须删除以下行:$salt ='';
在目前的代码中,只显示Base64编码的密文。对于 OpenSSL 格式的 Base64 编码结果输出,代码必须改为:
echo base64_encode('Salted__'.$salt.$encrypted_data);
openssl_encrypt
中的第 4 个参数应从 true
更改为 OPENSSL_RAW_DATA
。两者在功能上完全相同,但 OPENSSL_RAW_DATA
的使用更加透明。
JavaScript 和 PHP 代码每次都会生成新的盐,从而生成不同的 key 和 IV,每次都会更改密文。事情本该如此。由于盐与密文存储在一起,因此可以随时使用密码短语解密密文。
证明两个代码使用相同的逻辑来派生 key 和 IV:每次生成的新盐/密文防止直接比较两个代码的结果。为了毫不费力地执行此比较,最好在 PHP 代码中也使用 JavaScript 代码中生成的盐。 JavaScript 代码中的盐可以确定为十六进制字符串:
console.log(ciphertext.salt.toString(CryptoJS.enc.Hex));
此盐将用于 PHP 代码中,而不是随机生成的盐(当然仅用于这一次比较):
$salt = hex2bin('<Salt from JavaScript-Code as hexadecimal string>');
两个输出的比较现在证明它们是相等的,表明两个代码在功能上是相同的。
关于javascript - Crypto-js 本地端到 php 服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59200048/
我正在学习构建单页应用程序 (SPA) 所需的所有技术。总而言之,我想将我的应用程序实现为单独的层,其中前端仅使用 API Web 服务(json 通过 socket.io)与后端通信。前端基本上是
当我看到存储在我的数据库中的日期时。 这是 正常 。日期和时间就是这样。 但是当我运行 get 请求来获取数据时。 此格式与存储在数据库 中的格式不同。为什么会发生这种情况? 最佳答案 我认为您可以将
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试使用backbone.js 实现一些代码 和 hogan.js (http://twitter.github.com/hogan.js/) Hogan.js was developed ag
我正在使用 Backbone.js、Node.js 和 Express.js 制作一个 Web 应用程序,并且想要添加用户功能(登录、注销、配置文件、显示内容与该用户相关)。我打算使用 Passpor
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我尝试在 NodeJS 中加载数据,然后将其传递给 ExpressJS 以在浏览器中呈现 d3 图表。 我知道我可以通过这种方式加载数据 - https://github.com/mbostock/q
在 node.js 中,我似乎遇到了相同的 3 个文件名来描述应用程序的主要入口点: 使用 express-generator 包时,会创建一个 app.js 文件作为生成应用的主要入口点。 通过 n
最近,我有机会观看了 john papa 关于构建单页应用程序的精彩类(class)。我会喜欢的。它涉及服务器端和客户端应用程序的方方面面。 我更喜欢客户端。在他的实现过程中,papa先生在客户端有类
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一个图形新手,需要帮助了解各种 javascript 2D 库的功能。 . . 我从 Pixi.js 中得到了什么,而我没有从 Konva 等基于 Canvas 的库中得到什么? 我从 Konva
我正在尝试将一些 LESS 代码(通过 ember-cli-less)构建到 CSS 文件中。 1) https://almsaeedstudio.com/ AdminLTE LESS 文件2) Bo
尝试查看 Express Passport 中所有登录用户的所有 session ,并希望能够查看当前登录的用户。最好和最快的方法是什么? 我在想也许我可以在登录时执行此操作并将用户模型数据库“在线”
我有一个 React 应用程序,但我需要在组件加载完成后运行一些客户端 js。一旦渲染函数完成并加载,运行与 DOM 交互的 js 的最佳方式是什么,例如 $('div').mixItUp() 。对
请告诉我如何使用bodyparser.raw()将文件上传到express.js服务器 客户端 // ... onFilePicked(file) { const url = 'upload/a
我正在尝试从 Grunt 迁移到 Gulp。这个项目在 Grunt 下运行得很好,所以我一定是在 Gulp 中做错了什么。 除脚本外,所有其他任务均有效。我现在厌倦了添加和注释部分。 我不断收到与意外
我正在尝试更改我的网站名称。找不到可以设置标题或应用程序名称的位置。 最佳答案 您可以在 config/ 目录中创建任何文件,例如 config/app.js 包含如下内容: module.expor
经过多年的服务器端 PHP/MySQL 开发,我正在尝试探索用于构建现代 Web 应用程序的新技术。 我正在尝试对所有 JavaScript 内容进行排序,如果我理解得很好,一个有效的解决方案可以是服
我是 Nodejs 的新手。我在 route 目录中有一个 app.js 和一个 index.js。我有一个 app.use(multer....)。我还定义了 app.post('filter-re
我正在使用 angular-seed用于构建我的应用程序的模板。最初,我将所有 JavaScript 代码放入一个文件 main.js。该文件包含我的模块声明、 Controller 、指令、过滤器和
我是一名优秀的程序员,十分优秀!