Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.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
使用php为android创建身份验证令牌_Php_Android_Token - Fatal编程技术网

使用php为android创建身份验证令牌

使用php为android创建身份验证令牌,php,android,token,Php,Android,Token,我想使用身份验证令牌,在各种搜索之后,我找到了JWT令牌和另一种使用md5生成令牌的方法 出于各种原因,我不想使用JWT和md5标记,在我看来,它们的声誉很差 所以我找到了一个方法,但我想听听你的意见: 生成字节字符串: 然后我把它转换成十六进制 最后,我将其与我的用户id和salting连接起来 我将其发送到我的应用程序(Android或web),而不是在请求我的服务时,我解码接收到的令牌,我将看到令牌中隐藏的id中包含的令牌。 所以用蛮力找代币比较难 注1:我希望将来刷新代币,但目前应无限期

我想使用身份验证令牌,在各种搜索之后,我找到了JWT令牌和另一种使用md5生成令牌的方法

出于各种原因,我不想使用JWT和md5标记,在我看来,它们的声誉很差

所以我找到了一个方法,但我想听听你的意见:

生成字节字符串:

然后我把它转换成十六进制

最后,我将其与我的用户id和salting连接起来

我将其发送到我的应用程序(Android或web),而不是在请求我的服务时,我解码接收到的令牌,我将看到令牌中隐藏的id中包含的令牌。 所以用蛮力找代币比较难

注1:我希望将来刷新代币,但目前应无限期发行

注2:我不想只在php中使用库或框架

代码:

$bytes = random_bytes(32);
$part=bin2hex($bytes));
$shortpart=substr($part,0,17);
$id = #userid
$salt=#customsalt
$token=shortpart.$id.$salt;
例如:

$shortpart =f2e4d1f2a2dfedcf5
$id=1
$salt=4d2ze121
$token=f2e4d1f2a2dfedcf514d2ze121

用户或黑客不知道令牌中是否隐藏了id

在数据库表中为time添加一列,并将authtoken计算为:

$time = time();
并将其存储到数据库中

加密:

$encrypt = base64_encode($time.userid);
解密:

从表中获取时间:

  $decrypt = base64_decode($encrypt);

检查链接。

经过一些研究,我认为更好的方法是:

$token = bin2hex(openssl_random_pseudo_bytes(32));

并自定义此字符串。

您需要向我们显示执行此操作的代码。根据实际的实现和使用情况,即使是推荐的安全措施也可能存在漏洞。“我不想只在php中使用库或框架”-为什么不?谈到安全性,通常建议使用经过良好测试的现有库,而不是编写自己的解决方案。很容易错过一些会使您的应用程序受到攻击的内容。我添加了一个代码示例第一个原因是我要打开一个项目,并且一些库使用限制性许可证。其次,我希望纯php具有应用程序操作所需的严格要求。这里已经回答了这个问题:使用这个方法,我的数据库中有:token | time当我从客户机获得令牌时,我计算时间,我必须计算是否有一个带有time:time和token:token的令牌?base64的使用不是很安全吗?因为我们看到==表示基数,所以很容易知道令牌是由时间和一个数字(id)生成的。请不要使用
time()。另外,base64不是加密,而是编码,这是两码事。用盐等生成代币并不简单。如果您希望它至少是安全的,就不需要了。由于PHP7,实际上建议使用
random\u bytes()
而不是
openssl\u random\u pseudo\u bytes()
,因为前者是核心的一部分,而
openssl.*
函数要求您启用openssl。除此之外,没有什么大的区别,所以我不明白这是什么“解决方案”?它基本上和你已经在做的事情完全一样。我不是说你吝啬,但我认为你自己没有足够的知识来做这件事。密码学不是一门容易的学科,如果你犯了一个简单的小错误,你可能会把整个应用程序置于危险之中。你好@MagnusEriksson谢谢你的回复,我确实没有足够的密码学知识,所以我请求你的帮助,学习,我目前没有代码,但我想知道Tom提出的随机字节()方法是否是一件好事