这是一种安全的加密方法吗

2024-01-17

我正在为 Android 编写一个应用程序,它使用对称密钥加密来保护敏感数据。据我所知,Android仅直接支持“PBEWithMD5AndDES”。这个算法的安全性如何?另外,我在下面包含了我的代码(非andriod)。我的代码是否正确加密数据?

import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.InvalidParameterSpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

public class CipherTest
{

    private static class EncryptInfo
    {

        private final byte[] encryptedData;
        private final byte[] initVector;
        private final byte[] salt;

        public EncryptInfo(byte[] encryptedData, byte[] initVector, byte[] salt)
        {
            this.encryptedData = encryptedData.clone();
            this.initVector = initVector.clone();
            this.salt = salt.clone();
        }

        public byte[] getEncryptedData()
        {
            return encryptedData;
        }

        public byte[] getInitVector()
        {
            return initVector;
        }

        public byte[] getSalt()
        {
            return salt;
        }

    }

    private static final String keyGenAlgorithm = "PBEWithMD5AndDES";
    private static final String keyAlgorithm = "DES";
    private static final String cipherTransform = "PBEWithMD5AndDES/CBC/PKCS5Padding";

    private static EncryptInfo encrypt(char[] password, byte[] data)
            throws NoSuchAlgorithmException, InvalidKeySpecException,
            NoSuchPaddingException, InvalidKeyException,
            InvalidParameterSpecException, IllegalBlockSizeException,
            BadPaddingException, UnsupportedEncodingException
    {

        byte[] salt = new byte[16];
        new SecureRandom().nextBytes(salt);

        PBEKeySpec keySpec = new PBEKeySpec(password, salt, 1024);

        SecretKeyFactory secretKeyFactory = SecretKeyFactory
                .getInstance(keyGenAlgorithm);
        SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
        keySpec.clearPassword();
        byte[] key = secretKey.getEncoded();
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, keyAlgorithm);
        Cipher cipher = Cipher.getInstance(cipherTransform);
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

        byte[] initVector = cipher.getParameters().getParameterSpec(
                IvParameterSpec.class).getIV();

        return new EncryptInfo(cipher.doFinal(data), initVector, salt);
    }

    public static byte[] decrypt(byte[] data, char[] password, byte[] salt,
            byte[] initVector) throws NoSuchAlgorithmException,
            InvalidKeySpecException, NoSuchPaddingException,
            InvalidKeyException, InvalidAlgorithmParameterException,
            IllegalBlockSizeException, BadPaddingException
    {
        PBEKeySpec keySpec = new PBEKeySpec(password, salt, 1024);

        SecretKeyFactory secretKeyFactory = SecretKeyFactory
                .getInstance(keyGenAlgorithm);
        SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
        keySpec.clearPassword();
        byte[] key = secretKey.getEncoded();
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, keyAlgorithm);
        Cipher cipher = Cipher.getInstance(cipherTransform);
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(
                initVector));
        return cipher.doFinal(data);
    }

    public static void main(String[] args) throws Exception
    {
        char[] password = "password".toCharArray();

        EncryptInfo info = encrypt(password, "Message".getBytes());

        byte[] decyptedText = decrypt(info.getEncryptedData(), password, info
                .getSalt(), info.getInitVector());

        System.out.println(new String(decyptedText));

    }
}

MD5 和 DES 都很弱。如果您的加密数据确实很有价值,您应该寻找一些适用于 Android 的外部加密库,提供 AES 和 SHA256/SHA512 算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是一种安全的加密方法吗 的相关文章

  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • Android 上的 MIDI:Java 和/或 AIR 库

    一段时间以来 我一直在考虑在 iPad 上 重新 构建一个应用程序 其中我将使用 Objective C 和DSMI http dsmi tobw net 将 MIDI 信号发送到主机 这还不错 我的意思是 除了实际编写应用程序之外 现在我
  • 通过 appassembler-maven-plugin 生成的脚本无法在 Spring Boot 应用程序中找到主类

    我使用 appassembler maven plugin 生成的启动脚本有问题 我有一个基本的 spring boot 应用程序 只有一个类 SpringBootApplication public class ScriptDemoApp
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • Android模拟器中的网络访问

    我试图通过我的 Android 应用程序访问互联网 但我既成功又失败 我在构建应用程序时启动模拟器 并且应用程序安装得很好 我可以使用浏览器访问互联网 但是 当我尝试这个小代码片段时 InetAddress inet try inet In
  • 受信任的网络活动 - 地址栏不隐藏(Android 72 的 Chrome)

    我已经关注了this https developers google com web updates 2017 10 using twa了解如何使用受信任的 Web 活动的指南 一切正常 但地址栏仍然出现 一开始我认为这是因为当应用程序正在
  • clojure 有 AES 库吗?

    clojure 有 AES 加密库吗 我应该使用通过 maven 或 clojars 提供的 java 库吗 感谢您的时间和考虑 下面是一个使用可用的 java 加密库的可能更惯用的示例 encrypt and decrypt这里每个都简单
  • 如何使用 Javascript OAuth 库不暴露您的密钥?

    看着Twitter OAuth 库 https dev twitter com docs twitter libraries 我看到了这个注释 将 JavaScript 与 OAuth 结合使用时要小心 不要暴露你的钥匙 然后 看着jsOA
  • Android 标记如何实现拖放?

    你好 我正在 Android 中开发 MapView 应用程序 我有三个标记 我希望稍后能够使用 Google Map API getlocation function 为了尝试一下 我想使用拖放功能移动标记 然后检查位置 任何人都可以通过
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • Android-dispatchTouchEvent 给了我一个 StackOverflowError

    这里我有一个带有 setOnTouchListener 的 ViewFlipper 它工作得很好 然后我膨胀 ReLayNewsItem 然后将其添加到 ViewFlipper 现在我希望 WebView web 监听触摸事件并将它们传递给
  • HTTP 基本身份验证 + 访问令牌?

    我正在开发一个 REST API 计划将其与 Web 和 IOS 应用程序一起使用 我打算让这个 API 在一段时间内保持私有 私有意味着我只希望我的 Web 应用程序和 ios 应用程序访问该 API 我已经阅读了许多不同的身份验证方法
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向
  • 从文件路径显示图像视图?

    我需要仅使用文件名而不是资源 ID 来显示图像 ImageView imgView new ImageView this imgView setBackgroundResource R drawable img1 我在可绘制文件夹中有图像
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 为什么我的 .storyboards 在 Xcode 11.1 中变成红色?

    刚刚更新到 Mac OS X Catalina 10 15 和 Xcode 11 1 我的一些情节提要变成了红色 所有图形似乎都在那里 但一切都是红色的 非常红 如下所示 他们仍然发布正常 这在我的 MacBook Pro 上的 OS X
  • Character.getNumericValue 的相反是什么

    int x Character getNumericValue A System out println the value of x is x prints 10 我正在寻找一种方法somemethod 10 并返回 A java中是否存
  • 合并msi和exe

    我的部署项目创建 msi 文件和 exe 文件 是否可以将这些合并为一个 exe 是的 您可以创建一个包含 MSI 和 setup exe 引导程序文件的自解压安装程序 我认为可以使用 WinZip 来做到这一点 或者您也可以使用 Wind
  • 保存父实体时,新的子实体将不会保存

    我有一个父实体 foo存在于数据库中 我有一个属性bar在此实体上 一对多关系 Foo已分离 因为它使用 WebApi 进行反序列化 所以我这样做是为了foo context Foos AddOrUpdate foo 就算有新的bar附加到
  • 使用 WebJob 将 Web 应用程序发布到 Azure 时卡住

    我刚刚使用 WebJob SDK 将 WebJob 添加到我的 Web 应用程序中 现在 在发布Web应用程序时 VS在发布时卡住了 不会挂起 但也不会进展 我知道这是由 WebJob 引起的 因为当我删除webjobs list json
  • SQL 用撇号插入数据库

    我正在经典 ASP 上运行一个程序 并使用以下内容插入数据库 CreateJob CommandText INSERT INTO dbo Jobs JobID CompanyName DateReceived DateOfDocument
  • Git 生产/登台服务器工作流程

    目前我的网站 生产服务器 已经有很多代码了 现在我想开始在我的项目中使用 Git 并为我的团队设置一个临时服务器 有人可以给我任何建议吗 这是我脑海中的画面 Production Production server which alread
  • 如何处理外部不稳定的代码?

    I have asp net Web Api 2与外部一起使用的应用程序COM Object pvxcom 由于某些原因 COM 对象挂起 我没有机会报告错误pvxcom 我需要想出一些办法来绕过这个问题 我想澄清一些问题 如何设置外部源的
  • Swift 中的音频播放进度为 UISlider

    我看过一些关于在 Objective C 中实现这一点的帖子 但我无法通过 Swift 做到这一点 具体来说 我不知道如何实施addPeriodicTimeObserverForInterval在下面 var player AVAudioP
  • HTTP POST 和 Google Apps 脚本文件上传

    请原谅这个问题可能存在口是心非 但经过几个小时的搜索无果后 我选择向社区询问以下问题 有没有什么办法 使用以下带有 HTML 和 Javascript 的表单 带有 POST 或 GET 请求 我可以让用户从普通的 HTML 页面提交文件并
  • 如何启用 Weblogic 12.1.2 JPA 2.1

    我一直在将我们的 Web 应用程序部署到 Weblogic 服务器 但是 尽管我能够在这个新版本中成功部署应用程序 但该应用程序无法启动并且用户无法登录 日志是 May 29 2015 4 38 47 PM org springframew
  • 使用 React.js 生成随机数

    我编写了这段代码 但是当我运行它时 我只得到一个空白页 怎么了 看来我确实很接近答案了 我已经尝试了一切 但仍然不起作用 class Button extends React Component constructor props supe
  • VBA 自动化错误 - 关闭表单时出现“服务器 [不是服务器应用程序]”

    我尝试以面向对象的方式创建表单 如这个答案所示 https stackoverflow com a 38382104 4460023 https stackoverflow com a 38382104 4460023 关闭表单后 我想引用
  • 当状态更改导致键盘在工作表中辞去第一响应者身份时,SwiftUI iOS 应用程序崩溃

    我正在尝试创建一个在工作表中查看具有多个 页面 该视图持有一个 State枚举变量 我在页面之间 切换 if self page text else if self page image else 但是 如果在其中一个页面中的文本字段处于活
  • 进行 dockerized 构建,缓存依赖拉取层

    我使用得很开心skaffold开发一些 Kubernetes 服务 但我周期中最长的步骤之一是拉取容器的所有依赖项 有人对如何最好地缓存层中的所有依赖项有建议吗 是否有在 docker 容器内构建 go 二进制文件的最佳实践 我应该有一个层
  • 在哈希映射中存储对向量项的引用时,绑定的生存时间不够长

    我是 Rust 的新手 仍在与借用检查器和正确的生命周期作斗争 这是我开始构建的一个简单的结构 它存储命令行参数的集合 例如事物 可以用 string or a c或两者 struct OptionMap lt a T a gt name
  • 检查 UI_USER_INTERFACE_IDIOM() 以确定它是 iPhone 还是 iPad 是否安全?

    我找到了这段代码 here http www devx com wireless Article 44472 1954 if UI USER INTERFACE IDIOM UIUserInterfaceIdiomPad str NSStr
  • python gremlin连接超时问题

    获取 gremlin 驱动程序超时问题如下 我们已经提高了吞吐量并进行了尝试 但仍然在进行中 12 05 2019 06 50 33 gt 1376bf ERR Traceback most recent call last 12 05 2
  • 使用 javascript 创建元素

    我有一个 html 表格 table thead Column Headers here thead tbody data here lt 3 tbody table 这是我的 php sample php
  • 这是一种安全的加密方法吗

    我正在为 Android 编写一个应用程序 它使用对称密钥加密来保护敏感数据 据我所知 Android仅直接支持 PBEWithMD5AndDES 这个算法的安全性如何 另外 我在下面包含了我的代码 非andriod 我的代码是否正确加密数