JavaScript在sha512中加密,并在原始二进制数据中获得结果,如PHP hash()
JavaScript encrypt in sha512 and obtain result in raw binary data like PHP hash()
正如我在标题中所说,我需要重现这个PHP函数(在JavaScript中):
hash("sha512", "string", true);
棘手的部分如果是真的在最后意味着:
当设置为TRUE时,输出原始二进制数据。FALSE输出小写hexits。
如果我需要自己创建一些东西,如果我应该处理endian:,这也很重要
tiger算法现在使用大端字节排序。
参考:php.net-hash()
EDIT:经过一些测试和研究,这里是我需要在JavaScript:中复制的函数
hex2bin("string");
实际上,女巫CryptoJS我可以在hexa中获得结果。我不知道如何在行二进制数据(等同于hex2bin)中获得它。
我发现有了NodeJS和库加密,我们可以很容易地做到这一点,但我不使用NodeJS。我需要在经典JavaScript(或jQuery或任何其他可用的lib)中获得相同的结果。
我的目标是向Symfony的WSSE协议发送一个与数据库(passwordDigest)中的密码匹配的密码。
以下是我需要复制的PHP代码:
public function encodePassword($raw, $salt)
{
// ... Some check code for data
$salted = $this->mergePasswordAndSalt($raw, $salt); // Just do $raw."{".$salt."}";
$digest = hash($this->algorithm, $salted, true);
// "stretch" hash
for ($i = 1; $i < $this->iterations; $i++) {
$digest = hash($this->algorithm, $digest.$salted, true);
}
return $this->encodeHashAsBase64 ? base64_encode($digest) :
bin2hex($digest);
}
这是我实际拥有的JavaScript代码:
WSSE.encodePassword = function(password, salt) {
try {
var salted = WSSE.mergePasswordAndSalt(password, salt);
var digest = CryptoJS.SHA512(salted).toString();
for (i = 1; i < 5000; i++) {
digest = CryptoJS.SHA512(digest + salted).toString();
}
return WSSE.base64_encode(digest);
} catch(err) {
Log.e("WSSE", err.message);
return null;
}
};
此代码的问题在于,摘要变量始终包含hexa中的数据,而不是原始二进制数据中的数据。
一个想法,代码,还是解放所有人?
我找到了一个基于EmberJS的WSSE实现的解决方案:https://github.com/Gerfaut/ember-simple-wsse-auth
正好在https://github.com/Gerfaut/ember-simple-wsse-auth/blob/master/packages/ember-simple-wsse-auth/lib/core.js
Ember.SimpleWsseAuth.EncodePassword = function(password, salt) {
var salted = password + '{' + salt + '}';
var passwordEncoded = CryptoJS.SHA512(salted);
for(var i = 1; i < this.passwordEncodingIterations; i++) { //TODO use webworker
passwordEncoded = CryptoJS.SHA512(passwordEncoded.concat(CryptoJS.enc.Utf8.parse(salted)));
}
return this.passwordEncodingAsBase64 ? passwordEncoded.toString(CryptoJS.enc.Base64) : passwordEncoded;
};
您的编码器密码功能变为
WSSE.encodePassword = function(password, salt) {
try {
var salted = WSSE.mergePasswordAndSalt(password, salt);
var digest = CryptoJS.SHA512(salted);
for (i = 1; i < 5000; i++) {
digest = CryptoJS.SHA512(digest.concat(CryptoJS.enc.Utf8.parse(salted)));
}
return WSSE.base64_encode(digest);
} catch(err) {
Log.e("WSSE", err.message);
return null;
}
};
使用http://movable-type.co.uk/scripts/sha512.html您可以获得与使用功能相同的输出
hash('sha512', 'puma');
这是Chris Veness 的优秀解决方案
- 将地理编码结果转换为php变量以发布到mysql数据库
- 使用php脚本验证访问者的年龄,并在不刷新的情况下根据结果加载iframe
- AJAX调用后Php结果未显示
- Ajax/Php得到一个以上的结果
- 使用PHP通过HTML表单选项选择器过滤MYSQL结果
- PHP,MySQL,AJAX-调用AJAX结果后,Bootstrap CSS样式不会显示
- 如何根据JavaScript函数的结果用PHP编写数据库?(FB应用程序)
- 防止 PHP 在新页面中显示结果
- Javascript调用php函数并接收返回的结果
- 在php中隐藏/显示切换回声结果
- 使用jquery UI next按钮提交输入字段值,php将返回结果
- 如何以绘图表格式输出PHP结果
- 使用ajax运行php脚本不会显示任何结果
- php中的日期格式给出了错误的结果
- 如何使用SHA256使用PHP和CryptoJS获得相同的结果
- php/mysql搜索结果-当类型>1,同时保持其他类型不>1-代码点火器
- 如何使用ajax调用php并返回结果
- 如何在php JSON编码结果中包含谷歌分析
- 如何在javascript变量中获取php文件的结果
- 在jQuery函数中获取结果PHP代码