Android 中加密的String:让我们做出更少的失误

     如果你在网上搜索“Android 字符串加密”,估计你可以找到大量的实例代码,比如MD5加密,比如DES加密,这些方式输入的字符串和输出像乱码一样的加密字符常常也是不正确的。加密是个比较棘手的问题,它是很难说从搜索出的代码没有严重的缺陷。
     要正确的使用它,必须了解该算法的性能和代码的安全目标, 也许这些不好的加密代码被发布在网上是可以被接受的,但现在有更好的加密方式让我们不能再接受这些代码。

     谷歌Android字符串的加密有个失误,由于是在谷歌第一主打,该代码已经普遍很多地方,其中包括数百个Github上的项目。
    典型的错误:

   *坏密钥生成:理想情况下,AES密钥应牢固并生成随机。另外,根据不同的使用情况,您可以使用标准的基于密码的方法来生成一个密钥,是强如密码。很多网站建议使用从密码作为种子的随机数生成的字节数。这是不对的。 
   *过时密钥生成的:在2013年,人们认识到,在Android的SecureRandom实现是有缺陷和开发人员需要明确初始化PRNG熵。

   *使用ECB:在Android中AES的默认模式是ECB,其加密每个块是一样的,因此受到的分析和攻击,[ECB的一个例证](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_codebook_.28ECB.29)想象你加密了一堆密码:你可以不一定解密密码,没有钥匙,但你可以告诉哪些网站使用相同的密码。更好的方式是CBC,而且该模式已经可以在Android使用了相当长的一段时间。


   *没有诚信:很多人认为AES在创建中具有完整性检查,这个思想是:“如果解密正确,它被人用私钥生成”。实际上,AES CBC允许攻击者修改这个消息。在我们的搜索中,我们没有发现在用AES CBC做诚信检查的一个例子。 

   *不正确第IV:当使用例如CBC模式,随机IV是必需的。这使得与密文稍微复杂一点,因为交易需要保留的(非机密)四周围解密。由于它的棘手,有时人们使用固定的IV,这是经常坏。Android的做一些非常奇怪的事情,如果你不指定IV,你加密的东西,永远也无法解密。

   *弱算法:使用DES或MD5的是有问题的,因为两者的那些算法已被证明是弱并且不应再被使用。
 解决问题:
     使用AES 库构建,提供一个Java AesCbcWithIntegrity类,很方便的添加在Android项目中。 
     特性:
     *简单 一个非常简单的Java类,在大多数或所有版本的Android。类应该易于粘贴到现有的代码库
     * 加密字符串: 它应该加密任意的字符串或字节数组。这意味着它需要有效地处理多个街区(CBC)和部分街区(填充)。序列化、反序列化密文的持之以恒、静脉注射和关键材料使用base64使它容易
     *算法和模式 :选择AES 128,CBC,PKCS5填充
     *IV Handling: 安全地生成一个随机在每个加密和提供一个简单的类保持IV和密文一起所以他们容易跟踪和存储
     *诚信:添加了或多或少地透明的完整性检查的形式,这是组合键的形式,128位的密钥用于加密和256位用于完整,然后钥匙保存在一起
 [参考](http://tozny.com/blog/encrypting-strings-in-android-lets-make-better-mistakes/)
 [源码和实例](http://download.csdn.net/detail/jackiandroid/9355623)
### Apache2 权限问题解决方案 当遇到 `permission denied` 错误时,通常是因为文件或目录的权限设置不正确,或者 Web 服务器运行的身份没有足够的权限来访问所需的资源。以下是可能的原因以及对应的解决方法: #### 文件和目录权限配置 确保目标文件及其父级目录具有适当的权限。可以通过以下命令调整权限: ```bash chmod -R 755 /path/to/resource chown -R www-data:www-data /path/to/resource ``` 上述命令中的 `www-data` 是默认情况下 Apache 使用的操作系统用户组名称[^1]。 如果仍然存在权限问题,则可以进一步检查 SELinux 或 AppArmor 的状态。这些安全模块可能会阻止 Apache 访问某些路径。禁用它们或将策略更改为允许模式可能是必要的临时措施(仅用于测试)。例如,在 CentOS 上关闭 SELinux 可通过编辑 `/etc/selinux/config` 并将其值设为 `SELINUX=permissive` 实现。 #### 配置虚拟主机或目录指令 确认 Apache 虚拟主机配置中是否设置了正确的 `<Directory>` 块并启用了读取权限。示例配置如下所示: ```apache <Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ``` 此部分应位于站点配置文件内,比如 `/etc/apache2/sites-available/your-site.conf` 中。 #### HTTPS 强制重定向引发的问题 如果有强制使用 SSL/TLS 的需求,请验证 `.htaccess` 文件或其他位置是否存在类似下面这样的规则错误应用到不应该被加密连接影响的部分网站结构上: ```apache RewriteEngine On RewriteCond %{HTTPS} !=on [NC] RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L] ``` 这段代码片段会将所有请求转向 HTTPS 版本;然而,它也可能引起循环重定向等问题,特别是在子域名处理不当的情况下。 #### 测试网络通信状况 利用工具如 cURL 进行调试可以帮助理解客户端与服务端之间的交互过程是否有异常情况发生。例如发送 POST 请求给受保护的服务接口时可附加认证信息头字段尝试解决问题: ```bash curl -X GET \ -H "Authorization: Basic $(echo -n 'username:password' | base64)" \ http://example.com/api/v1/resource ``` 另外也可以参考样例调用远程执行器API获取当前正在运行的任务列表的状态返回码判断具体失败原因[^2]。 #### Java HTTP 客户端身份验证支持 对于基于Java的应用程序来说,若需向外部提供基本HTTP鉴权机制的话,那么应该考虑采用Android SDK 提供的方法实现自动填充用户名码功能以便简化开发流程减少人为失误几率提高安全性水平。像这样一段简单的java代码就可以完成这项工作: ```java public class HttpAuthExample { public static void main(String[] args){ URL url; try{ url = new URL("http://server"); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); Authenticator.setDefault(new Authenticator(){ @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication ("user", "passwd".toCharArray()); } }); InputStream content = (InputStream)connection.getInputStream(); } catch(Exception e){} } } ``` 这里我们创建了一个匿名内部类覆盖了getPasswordAuthentication 方法从而实现了自定义的行为逻辑即每当检测到来自指定host 和realm组合形式下的挑战响应都会按照预定义好的方式作出反应[^3]. 综上所述,针对 apache2 出现 permission denied 报错的情况可以从多个角度入手排查分析根本原因是由于文件系统的属性设定不合理还是其他因素干扰所致最终达到修复目的.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值