Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Blowfish和Ruby验证在PHP中加密的密码_Php_Ruby_Authentication_Encryption_Blowfish - Fatal编程技术网

使用Blowfish和Ruby验证在PHP中加密的密码

使用Blowfish和Ruby验证在PHP中加密的密码,php,ruby,authentication,encryption,blowfish,Php,Ruby,Authentication,Encryption,Blowfish,有一个用PHP编写的应用程序,我正在将其转换为Ruby。加密密码时,PHP应用程序使用以下代码: if($method == 2 && CRYPT_BLOWFISH) return crypt($pass, '$2a$07$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx$'); 我假设这是使用河豚实现的。这里的x都是a-zA-Z0-9字符 Ruby中的Blowfish实现使用以下语法(摘自):

有一个用PHP编写的应用程序,我正在将其转换为Ruby。加密密码时,PHP应用程序使用以下代码:

if($method == 2 && CRYPT_BLOWFISH) return crypt($pass, '$2a$07$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx$');
我假设这是使用河豚实现的。这里的x都是a-zA-Z0-9字符

Ruby中的Blowfish实现使用以下语法(摘自):


我没有一个56字节或更少的字符串,并且不清楚PHP版本应该是什么。那么,我如何编写一个Ruby函数来加密密码,从而得到与PHP相同的结果呢?

如果设置了
CRYPT_BLOWFISH
CRYPT_BLOWFISH==1
),PHP代码将使用salt
$2a$07$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxx$
。salt必须遵循PHP文档中指定的格式(
“$2a$”,一个两位数的成本参数“$”,以及字母表中的22位数“/0-9A-Za-z”

我不确定你是否可以用你所引用的库来实现,但是你可以用
bcryptruby
来代替

对于您的代码,应该是这样的,我使用的是来自PHP示例()的相同数据,我只使用salt的前29个字符,因为除此之外,PHP会忽略它:

require 'bcrypt-ruby'
pass = "rasmuslerdorf" # Here you should put the $pass from your PHP code
salt = '$2a$07$usesomesillystringfors' # Notice no $ at the end. Here goes your salt
hashed_password = BCrypt::Engine.hash_secret(pass,salt) # => "$2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi"
这将提供与PHP示例相同的输出。如果您的盐太长,则取前29个字符(2a$07$加上接下来的22个额外字符)

我测试了PHP的行为,如果salt太长(总共超过29个字符),其余的将被忽略,如果salt太短,它将返回0。例如,在PHP中:

<?php
  crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') 
  // returns $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

  crypt('rasmuslerdorf', '$2a$07$usesomesillystringfors')
  // returns $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

  crypt('rasmuslerdorf', '$2a$07$usesomesilly')
  // returns 0 because the salt is not long enough
?>

<?php
  crypt('rasmuslerdorf', '$2a$07$usesomesillystringforsalt$') 
  // returns $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

  crypt('rasmuslerdorf', '$2a$07$usesomesillystringfors')
  // returns $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

  crypt('rasmuslerdorf', '$2a$07$usesomesilly')
  // returns 0 because the salt is not long enough
?>