Part II: How to protect your HTTPS communication from Man-In-the-Middle’s decryption in Windows Store App–about which certificate should be included for “Exclusive Trust”

Months ago we wrote a blog article about How to protect your HTTPS communication from Man-In-the-Middle’s decryption in Windows Store App, which was also demoed during TechEd 2013 China last December. However, everything ran smoothly until last week… We reviewed the demo again but it failed with an error message that we’ve never seen when…

0

如何禁用GridView中的ScrollViewer的滚动

这篇文章所讨论的问题似乎有些基础,因为ScrollViewer控件有Horizontal/VerticalScrollMode属性可以用来控制滚动条的行为,如设定成ScrollMode.Disabled的期望结果就是能够禁用滚动操作。 一开始我们也是这样认为的,直到我们发现,在GridView中,如果当前使用的是触控,则通过此方法能够得到期望的结果,但是如果当前是在鼠标模式,那在设置成ScrollMode.Disabled之后,仍旧能够通过鼠标滚轮来进行ScrollViewer的滚动。 在Windows Store App中,无论是使用触屏还是传统的鼠标键盘,我们总是试图能够提供相对一致的用户体验,但是这里似乎在控件行为上两种输入方式产生了差异。 最初我们尝试通过捕获控件的PointerWheelChanged事件,但是由于这是属于RoutedEvent,所以即使我们在某一个层级UIElement的PointerWheelChanged设定了handled=true,也无法阻止visual tree中下层控件捕捉到滚动操作并响应。 经过多次尝试,我们最终得出了以下的解决方案,即当我们想要冻结滚动的时候,先获取到SV控件,然后获取到其偏移值,然后再绑定这个控件的ViewChanged事件,在每次事件触发时对其执行强制ScrollTo指令,测试可用。 ScrollViewer sv = GetVisualChild<ScrollViewer>(itemGridView); var frozenOffset = sv.HorizontalOffset; sv.ViewChanged += (ss,ee) => { sv.ScrollToHorizontalOffset(frozenOffset); }; 希望这个这个小贴士能够解决开发中碰到的实际问题。

0

在WP8中为地图控件加入当前地图的移动和停止的检测

在WP8,地图控件经过了修整,新的Map API 在Microsoft.Phone.Maps.Controls 命名空间下,而原来的BingMap control (在Microsoft.Phone.Controls.Maps命名空间,注意区别)已经不再推荐使用了。 这个CASE的需求非常简单,假设我们当前地图中的内容正在移动的时候,触发某些事件或者显示某些提示,而在停止移动之后,继而有另外一种提示,也就是需要找到一种方法,在WP8中,检测到当前地图正在移动或者停止移动。   我们的研究从Microsoft.Phone.Maps.Controls.Map 对象的若干个事件入手,但是发现都没有现成的能够满足我们要求的对象。诸如CenterChanged, ViewChanged,ZoomLevelChanged这些事件,也是只在某些如Center、ZoomLevel的相关属性变动时才会触发,但是并不能直接告诉我们当前地图正在移动或停止。 我们的解决方案是在CenterChanged事件中,加入一个DispatcherTimer,这个timer每间隔一定事件就进行检测,并和前一次timer触发时center有所改变而记录下的时间来进行比较,判断当前地图是否正在移动。代码实现如下:   1: DateTime lastCenterChangeTime = DateTime.Now; 2:  3: bool isChanging = false; //这里完全也可以设定成一个实现INotifyPropertyChanged的ViewModel的通知属性,这样一旦属性值改变了,就可以通过绑定反馈到视图页面 4:  5: 6:  7: private DispatcherTimer notifyCenterChangedTimer; 8: const int timerInterval = 100; //timer的执行间隔 9: const int changeMinInterval =300;//最小触发地图位置变动的时间间隔 10:  11: private void sampleMap_CenterChanged(object sender, MapCenterChangedEventArgs e) 12:  13: {…

0

如何在Windows商店应用中防止HTTPS通讯被中间人攻击解密?

背景 几个月前,我们这里接到一份消息,有个人评论一家业内著名的Windows Store开发者使用明文传递用户账号信息。这是一个很震惊的问题,我们无法想象这样一家著名的开发公司也会犯如此低级的错误。我们的生活早已离不开这家公司开发的软件,当然也离不开Windows 8。 在紧急的研究之后,我们发现,事实并非如此,实际上,这个App是使用加密的HTTPS信道去传输信息的。而评论这条消息的人正是使用了一种类似于中间人攻击的方法,在本地破解了HTTPS的传输,并读取到了内容。 而这个工具也是我们经常使用的用作HTTP分析的工具——Fiddler。不过,这个工具仅仅只能作为本地的代理去分析从本地或到达本地的流量。虽然我们没有办法去获取到加密过的HTTPS流量,但是我们可以使用这个工具去解密本机发出的HTTPS流量,无论我们是用什么样子的浏览器。 具体细节,可以参考Fiddler官方的一篇文章,http://fiddler2.com/Fiddler/help/httpsdecryption.asp,这篇文章描述了如果使用中间人攻击的方法,采用一张伪造的HTTPS证书来分析HTTPS流量。 其实,回到最初的问题,这个评论人提到的问题是可以在此App的不同平台版本下重现的,当然,也可以在其他软件中重现。而这位“怀有恶意的”评论人并没有提及这些事实,仅仅针对于Windows 8 Store版本。也使得我们不得不怀疑,这位评论人究竟出于什么样的原因编造了这样的事情。 虽然我们知道了事情的经过,也虽然我们这里并没有做错什么,可是我们是不是还能做点什么,避免此类事情的再次发生呢? 研究: 作为一名MSFT的工程师,我们还是把重点放在了技术上面。通过技术去减少此类不实评论。实际中,我们没有办法阻止中间人获取到流量信息,但是我们可以探测到他们。现在我们最大的困难是,在桌面时代,我们有着很多可用的API,可是在Windows RT时代,可用的资源就变少了。 最初,我们想在Windows RT上找到一种可以远程颁发证书的方法,像是在传统的.NET平台中做得一样,RemoteCertificateValidationCallback。不幸的是,直到最后,我们也没有办法在API层面上找到可以去验证SSL证书的方法。 不过,在配置层面呢? 解决方法: 之所以Fiddler可以去解密HTTPS流量,是在于,Fiddler把自己的证书放到了Windows的根信任证书里,而我们的Windows Store App又继承信任了Windows根信任证书。 如果我们把所有的信任证书都拿掉,仅仅保留一份我们自己的证书,事情就可以解决了。灵感来源于此,SSL server authentication using application specific trusted roots: 你可以编写 Windows 应用商店应用,该应用使用自己的信任密钥,而不是从系统信任中继承。在安装你的应用之后,你可以使用清单来指定根证书也安装在专用存储中,而且该应用可以使用根证书与 Web 服务器建立安全的 HTTPS 连接。根不必通过 Microsoft 根程序进行信任。根仅受你的应用的信任,而且不会影响对系统上其他应用的信任。 还有,Setting the certificates extension: 证书扩展使你能够随应用安装证书、指定是否从系统信任继承,以及设置证书选择标准。 事情变得简单了,我们仅仅需要让我们自己的App信任唯一的由我们自己颁发的证书就可以了。请看下面App Manifest文件的截图,在Solution Explorer里,仅仅需要把证书文件部分设置为“build action = content, copy if newer”:   哪里获得我们需要的证书: 在我们测试中,我仅仅用到了自签名的cer证书。但是,我们怎么能得到一张在生产环境中使用的证书呢?其实,很简单,去问问看你的网站管理员!不过,如果他不是很和蔼可亲怎么办?其实我们也可以自己从浏览器中提取。…

1

How to protect your HTTPS communication from Man-In-the-Middle’s decryption in Windows Store App

[Update Feb.24 2014] There might be a mechanism change of the certification trust logic recently. Check out our second post for the topic http://blogs.msdn.com/b/lighthouse/archive/2014/02/24/part-ii-how-to-protect-your-https-communication-from-man-in-the-middle-s-decryption-in-windows-store-app-about-which-certificate-should-be-included-for-exclusive-trust.aspx before going further.   Background: Months ago we got a report that a bad guy was accusing one Windows Store app provider of transferring the user credential in plain text, which was quite…

1

关于给WP推送通知启用HTTPS验证的细节

关于整个推送机制, 如何建立推送通道,在服务端和客户端的代码实现,互联网以及MSDN已经有无数中英文资料和示例了。然而,如果希望启用HTTPS推送,相关的资料就很少了。在这篇文章中我们主要希望谈论一下关于Windows Phone中为推送通知Push Notification启用HTTPS验证的一些所需要注意到的细节。 在默认情况下,Windows 8 store app的所有推送都是启用了HTTPS验证的,但是对于WP来说,默认情况下所有推送通道都是基于安全性较低的非加密通道HTTP,所以出于信息安全的考虑,我们推荐开启为推送通知开启HTTPS。除此之外,启用推送HTTPS验证的好处在于,能够解除每个推送通道每天500条推送的上限。而且最主要的是,除了开发商需要花钱购买一个受信任的证书以及一个WP开发者账户,一切都是免费的。 关于HTTP通讯的500条上限的解释,MSDN中的原文是这样的: There is no daily limit on the number of push notifications an authenticated web service can send. Unauthenticated web services, on the other hand, are throttled at a rate of 500 push notifications per subscription, per day. 很多开发者对于这里关于“per subscription, per day”的描述有一些理解偏差。实际情况是,基于对一个APP来说,在一个WP设备上,只能申请到一个Push Notification Channel (“subscription”),而每台不同设备的APP所能申请到的Channel Uri都是独特的,那么这里的限制就是对于这一个Channel Uri,只能够推送500个。所以说,对于每一个APP,HTTP推送在每个单独设备上的每日上限是500个,APP互相之间额度也不共享不冲突。…

0

如何在Windows Phone和Windows 8 Store中获取到设备ID

背景 很多情况下,我们需要去辨识当前App运行的设备,以便应用一些适合此设备的内容。Windows Phone 7时代,我们有一些原生的去获取设备号的方法。但是来到Windows Phone 8时代,却有些改变。至少在Windows 8 RTM中,获取Unique ID的方法消失了。但是这个问题在这一年里被广泛的提及。 解决方法 Windows Phone 7.X 典型用法: (注意:不要忘记把ID_CAP_IDENTITY_DEVICE加入到App Manifest里面) 1: byte[] myDeviceID = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue(“DeviceUniqueId”); 2: 3: string DeviceIDAsString = Convert.ToBase64String(myDeviceID); 在Microsoft.Phone.Info.DeviceExtendedProperties中有一句话需要注意: 在 Windows Phone OS 7.0 中,此类被用来查询特定于设备的属性。在 Windows Phone OS 7.1 中,DeviceExtendedProperties 的大多数属性已弃用,而应改用新的 DeviceStatus 类。但是,在适当时,您仍然可以使用以下任何未弃用的属性。 不管怎样,我们依然需要使用DevieExtendedProperties去获取“DeviceUniqueID”。因为在新的Microsoft.Phone.Info.DeviceStatus中没有被提及。 Windows Phone 8 当然,上文提及的API在Windows Phone 8中还是可以使用的。但是新的API在Windows Phone 中也有所提及。使用HostInformation.PublisherHostId可以直接获取到一段包含设备号的string。并且,这个API可以在.NET和C++中使用。不过,这里也有一些改变,对于在Windows Phone 8或后续版本中运行的不同的Windows Phone 8的app来说,DeviceUniqueID的值也是不一样的。换一种说法也就是,两个App分别被不同的Windows…

0

学用Windows Phone 8中Hyperlink和Command

偶然得知,Windows 8.1中把Hyperlink加到了XAML中去了,这使我想到Windows Phone中也早已把相同的元素加进去,但是罕有文档说明。 接下来,我将演示一下,如何在Windows Phone 8中通过Hyperlink来实现导航和激活事件。 首先,我们需要在Visual Studio中新建一个Windows Phone的工程,并加入以下XAML: 1: <TextBlock x:Name=”tb1″></TextBlock> 2: <RichTextBox> 3: <Paragraph> 4: <Hyperlink>First Link</Hyperlink> 5: Some Text 6: <Hyperlink>Second Link</Hyperlink> 7: </Paragraph> 8: </RichTextBox> 现在,按下F5启动调试,这里我们能看到界面中有两个超链接存在。下面,我们在一个链接中加URL,在另外一个链接中添加一个事件。 1: <TextBlock x:Name=”tb1″></TextBlock> 2: <RichTextBox> 3: <Paragraph> 4: <Hyperlink NavigateUri=”/Page1.xaml”>First Link</Hyperlink> 5: Some Text 6: <Hyperlink Click=”Hyperlink_Click”>Second Link</Hyperlink> 7: </Paragraph> 8: </RichTextBox> 最后,我们演示一下Hyperlink.Command。这个Command是一个激活动作,而不是一个绑定在按钮上的事件。在这里,我们需要给它绑定一个动作: 1: <TextBlock…

0

Windows Phone 8 内购FAQ

尽管MSDN里有一篇很好的关于Windows Phone 8内购的文章,我们这里还是收到很多内购相关的问题。这篇博客旨在为了补充MSDN文章中没有涵盖的一些细节。 我们听到很多有关于Windows Runtime和Windows Phone Runtime互相共享代码的事情。而且,的确内购部分是相互共享的。事实上,我们在MSDN上看到的有关于Windows Phone的文章数远远大于Windows Store。而且,由于很多API是Windows 8中独有的,例如 CurrentAppSimulator,ProductLicense.ExpirationDate等等,所以我们在阅读这些文章的时候要多加注意。 这篇博客主要是适用于Windows Phone的内购,不过,Windows 8 Store App和Windows Phone Store App在内购方面的流程还是很相似的。 MSDN相关文章: In-app purchase for Windows Phone 8 http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206949(v=vs.105).aspx In-App Purchase API overview for Windows Phone 8 http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206950(v=vs.105).aspx In-app purchase testing for Windows Phone 8 http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj681689(v=vs.105).aspx Mock In-App Purchase Library http://code.msdn.microsoft.com/wpapps/Mock-In-App-Purchase-33080f0c In-app product properties http://msdn.microsoft.com/en-us/library/windowsphone/help/jj206721(v=vs.105).aspx In-app product…

3

Beginning with Hyperlink and Command in Windows Phone

Occasionally read the XAML control changes for Store App development in Windows 8.1, an interest thing notified me is that Windows 8.1 adds the Hyperlink element to XAML text object model, which recalled me that the same element has been added into Windows Phone already, but with less documents for its use. In the following…

0