2022年4月

主要语言是object-c,建议学完C以后再学OC,然后在学UI开发。

获取某个文本框的内容,文本框名称定义为txtnum0,获取的类型text。

NSString *num0 = self.txtnum0.text;

字符类型转换(OC)

int n0 = num0.intValue;

改变文本属性,使呈现结果,文本控件名labnum

self.labnum.text = [NSString stringWithFormat:@"%d",n3];
}

由于点击文本框时,调用了键盘,但是点击计算按钮以后键盘没有叫回,使用以下代码叫回键盘,假设调出文本框为txtnum0,则

[self.txtnum0 resignFirstResponder];

叫回键盘必须由第一响应者叫回,即谁叫出谁叫回。但如果有多个文本框控件的时候,我们不知道用户点的是那个,第一响应者是谁,上述方法失效。
那么用什么方法做到上述情况下的键盘叫回?我们都知道self.view表示当前控制器所管理的view,让当前控制器所管理的view停止编辑即可实现键盘叫回,这样的话,凡在这个view中的文本框控件都会被叫回,具体代码:

[self.view endEditing:YES];

偶尔闲着,写写文章

文件下载

[button color="info" icon="" url="https://zai.ink/usr/uploads/2022/04/1568826707.zip" type="round"]iOS档案馆应用支持.zip[/button]

文件解析

什么工具生成的我不知道,iOS开发我也不太懂,在这里简单的给大家解析一下这个文件。
上述文件下载,将zip解压,得到iOS档案馆应用支持.mobileconfig这个文件。右击,随便找个文本编辑器打开,在这里我用Sublime给大家简单的打开看一下。
图0
前面的一大串没什么用,我也看不懂,但到了<key>Icon</key>这组数值的时候,可以看到以Icon为键的数值是一个base64编码的值,通过键名很容易猜测到只是一张图片,在这一大串看不懂的代码前,加上data:image/png;base64, 在浏览器中打开,就可以看到这是一张经过base64编码的图片。同理,可以找一张自己的图片,编码以后放进去。
图1
继续往下走:图2
看这个键<key>Label</key> 应该是标签的解释。
<key>URL</key>顾名思义就是你要封装的url地址。
下面还有一些,自己慢慢捉摸吧,我也用不到。。。

在WEB开发过程中,存储密码常用的加密方法就是使用MD5不可逆加密,也就是说当用户将密码交给我们存储的时候,我们不需要看到他们的密码,只需要保存加密以后的密文即可。

问题

MD5不可逆,但只要有足够的算力+PB级的数据库,这个时候MD5加密就变得具有可破解性,这是很危险的,一但用户数据在存储、备份等操作过程或由于系统安全原因造成造成意外用户信息泄漏,不仅会降低企业信誉还可能要承担一定的法律责任。

解决

其实解决上述方法,在搜集的过程中我也见到了各种奇葩的操作,比如把服务器IP作为数据值掺杂在密文中。或者把明文加密成32字符十六进制数以后,将前十六位和后十六位拆分开,将他们分布加密成32字符十六进制数后再合并,接着重新走一遍MD5加密。此种方法以此类推,我们还可以在拆分以后分别加入一些用户的信息,也就是在字符串前/后每次加入自定义字符串,例如用户的UID/注册时间,然后将他们与密码加密后的值组合,再次进行MD5加密,这样得到的是一个少数规则的密文,没有足够的数据库来支撑破解。

总结

思路就是这个思路,总的来说想要安全存储用户数据,就要先写一个自己的加密协议,利用MD5不断的重复加密,在加密过程中使用我们的规则进行打乱,得到密文存入数据库。

如何得到用户密码?

得不到。

如何校验用户密码是否正确?

用户输入密码递交表单,将数据传递到服务器,经过我们的加密得到的数值等于数据库存放的数据,密码正确,否则错误。

原因

已知QQ互联APP IDAPP Key填写正确,回调地址无误。
本地测试一切正常,拿到用户那边测试的时候却出现报错,报错如下:

-1
client request's parameters are invalid, invalid openid

这种bug的出现是随机性的,且本地测试环境一切正常,多番查找原因无果,只能重写。
重写以后故障依旧,仔细阅读官方开发文档以后得到下面解决方法:

解决

在回调文件中我们要定义两次$qc= new qc(),第一次用于获取正确的access_token 和openid,而第二次用于保证正确传输access_token和openid以保证api的正常使用,否则报错client request's parameters are invalid, invalid openid
最简单的方法就是在第一次new QC()之后,立即获取access_token和openid,并立即重新使用获取到的access_token和openid来重新定义QC()类,以防止变量丢失或被覆盖。
核心回调代码示例:

$qc = new QC();
$acs = $qc->qq_callback();
$oid = $qc->get_openid();
$qc = new QC($acs,$oid);
$uinfo = $qc->get_user_info();