Php js中的mysql密码()
我想从js生成mysql密码哈希 我知道php函数的方法Php js中的mysql密码(),php,javascript,mysql,Php,Javascript,Mysql,我想从js生成mysql密码哈希 我知道php函数的方法 $p = "example"; echo("$p<br>"); $p2= sha1($p,true); echo("$p2<br>"); //ĂI')s~űvŠ-Ëo? $result = sha1($p2); echo("$result<br>"); //*57237bb49761f29ab9724ba084e811d70c12393d - this is the same as password
$p = "example";
echo("$p<br>");
$p2= sha1($p,true);
echo("$p2<br>"); //ĂI')s~űvŠ-Ëo?
$result = sha1($p2);
echo("$result<br>"); //*57237bb49761f29ab9724ba084e811d70c12393d - this is the same as password("example") in mysql
因此,在上面的示例中,您正在调用:
hex_-sha1(hex2bin(hex_-sha1(string)))
。你确定那是对的吗?为什么需要两次hex_sha1
几个月前,我在JS中需要SHA1,并发现:
。。。而且效果还不错;)
解决方案(部分):
正如你所说,主要问题是字符集编码。似乎在散列数据之前,MySQL
没有对任何数据进行编码。在处理十六进制数据时,这并不代表问题,但是,MySQL
的UNHEX
(hex2bin
在JS中)返回一些不可读的字符,如果我们使用UTF8
对结果进行编码,则所有字符都会分离
当我在第行编辑JS的SHA1以不对数据进行编码时(我只对该行进行了注释):
一切似乎都很好。然而,当我提供一些UTF8
字符输入时(例如中欧字符楓đ
),它又开始失败了
所以,底线是,如果您在JS
sSHA1
功能中禁用UTF8
,并且在输入时不提供UTF8
字符,那么它可以正常工作
我确信有一个解决方案,比如
JS
函数,它将解码UTF8
输入,以便JS可以正确地散列它。因此,在上面的示例中,您正在调用:hex_-sha1(hex2bin(hex_-sha1(string))
。你确定那是对的吗?为什么需要两次hex_sha1
几个月前,我在JS中需要SHA1,并发现:
。。。而且效果还不错;)
解决方案(部分):
正如你所说,主要问题是字符集编码。似乎在散列数据之前,MySQL
没有对任何数据进行编码。在处理十六进制数据时,这并不代表问题,但是,MySQL
的UNHEX
(hex2bin
在JS中)返回一些不可读的字符,如果我们使用UTF8
对结果进行编码,则所有字符都会分离
当我在第行编辑JS的SHA1以不对数据进行编码时(我只对该行进行了注释):
一切似乎都很好。然而,当我提供一些UTF8
字符输入时(例如中欧字符楓đ
),它又开始失败了
所以,底线是,如果您在JS
sSHA1
功能中禁用UTF8
,并且在输入时不提供UTF8
字符,那么它可以正常工作
我确信有一个解决方案,比如JS
函数,它将解码UTF8
输入,以便JS可以正确地对其进行哈希运算。与两种编码一起使用
以下是一个例子:
var password = "TestPassword";
var result = ("*"+CryptoJS.SHA1(CryptoJS.SHA1(password))).toUpperCase();
console.log("result : " + result);
结果将是*0F437A73F4E4014091B7360F60CF81271FB73180。如果您使用mysql password()检查它,它将是相同的:
mysql> select password("TestPassword") as result;
+-------------------------------------------+
| result |
+-------------------------------------------+
| *0F437A73F4E4014091B7360F60CF81271FB73180 |
+-------------------------------------------+
与2个编码一起使用
以下是一个例子:
var password = "TestPassword";
var result = ("*"+CryptoJS.SHA1(CryptoJS.SHA1(password))).toUpperCase();
console.log("result : " + result);
结果将是*0F437A73F4E4014091B7360F60CF81271FB73180。如果您使用mysql password()检查它,它将是相同的:
mysql> select password("TestPassword") as result;
+-------------------------------------------+
| result |
+-------------------------------------------+
| *0F437A73F4E4014091B7360F60CF81271FB73180 |
+-------------------------------------------+
2017年解决方案 下载文件2.5.3-crypto-sha1.js
var key='*'+Crypto.SHA1(Crypto.util.hexToBytes(Crypto.SHA1('test')).toUpperCase(); 键=*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 MySQL中的测试 选择密码('test')/*功能*/ 联合 选择“*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29”/*由javascript生成的键*/ 联合 选择CONCAT(“*”,上部(SHA1(UNHEX(SHA1(‘测试’)));/*Password()函数的逻辑*/
2017年解决方案 下载文件2.5.3-crypto-sha1.js
var key='*'+Crypto.SHA1(Crypto.util.hexToBytes(Crypto.SHA1('test')).toUpperCase(); 键=*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 MySQL中的测试 选择密码('test')/*功能*/ 联合 选择“*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29”/*由javascript生成的键*/ 联合 选择CONCAT(“*”,上部(SHA1(UNHEX(SHA1(‘测试’)));/*Password()函数的逻辑*/
为什么要用javascript来做?如果你知道如何使用php,为什么不从php文件中请求结果呢?是的,因为我想提交密码,也许你应该从你尝试做的事情开始。在javascript中生成哈希密码是不安全的。一旦在服务器上创建密码,您会如何处理它?如果您将密码发送回服务器,则该密码对公众开放。您应该在加密之前发送密码,并在服务器上散列密码,然后再将其存储在数据库中。为什么要使用javascript执行此操作?如果你知道如何使用php,为什么不从php文件中请求结果呢?是的,因为我想提交密码,也许你应该从你尝试做的事情开始。在javascript中生成哈希密码是不安全的。一旦在服务器上创建密码,您会如何处理它?如果您将密码发送回服务器,则该密码对公众开放。您应该在加密之前发送密码,并在将其存储到数据库之前在服务器上散列。因为mysql密码散列就是这样创建的。出于某种原因,它使用了两次sha1算法。我已经厌倦了你的算法,但它在最后给出了9a5355dce26b1adfa0bdbe9f2b2a6e5ae58e5c9d,所以hax2bin是错误的/或者是一些字符编码问题???嗯,我玩了一些
UNHEX
和你的hex2bin
函数,奇怪的是,当我提供常量参数时,它们的工作原理是一样的。另一方面,当我提供sha1
hash(两者相同)时,它们输出不同的值。我会继续挖掘更多信息,如果发现任何有用的信息,我会告诉你……我放弃了这个,选择了一种更安全的方式:https我想base64_编码可以完全解决这个问题,因为mysql密码散列就是这样创建的。出于某种原因,它使用了两次sha1算法
mysql> select password("TestPassword") as result;
+-------------------------------------------+
| result |
+-------------------------------------------+
| *0F437A73F4E4014091B7360F60CF81271FB73180 |
+-------------------------------------------+
var key = '*' + Crypto.SHA1(Crypto.util.hexToBytes(Crypto.SHA1('test'))).toUpperCase();
key = *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
Test in MySQL
SELECT PASSWORD('test') /* function */
UNION
SELECT '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' /* Key generated by javascript */
UNION
select CONCAT('*', UPPER(SHA1(UNHEX(SHA1('test'))))); /* Logic for Password() function */