精华内容
下载资源
问答
  • android平台Oaid匿名设备标识符的获取

    千次阅读 2020-02-19 15:02:56
    前言 2019年4月24日,移动安全联盟于深圳成功召开移动智能终端设备标识研讨会。下一步计划由头部设备厂商...以后逐渐要禁止获取IMEI,使用OAID(匿名设备标识符)来替代IMEI在app的作用(另外我们也可以获取VAID和AA...

    前言

    2019年4月24日,移动安全联盟于深圳成功召开移动智能终端设备标识研讨会。下一步计划由头部设备厂商先行,逐步推动体系落地实施,并由中国信通院牵头开发支持多厂商、多终端类型的统一补充设备标识SDK,协助移动应用开发者更便捷的使用移动智能终端补充设备标识体系,推进相关业务。

    以后逐渐要禁止获取IMEI,使用OAID(匿名设备标识符)来替代IMEI在app的作用(另外我们也可以获取VAID和AAID,下文会提到)

    SDK支持的终端范围(2019年数据):
    在这里插入图片描述
    为保护用户用户的隐私和标识设备的唯一性,根据不同使用对象和不同用途,基于移动智能终端设备,分别生成设备唯一标识符匿名设备标识符开发者匿名设备标识符应用匿名设备标识符,将这四个设备标识符构成补充设备标识体系。
    在这里插入图片描述

    移动智能终端补充设备标识体系统一调用 SDK的集成

    准备工作:
    访问 http://www.msa-alliance.cn/col.jsp?id=120 移动安全联盟官网,在最下边下载对应的msa_sdk_v1.0.10压缩文件,解压获取对应的jar包和工具类。
    开始集成
    1,把 miit_mdid_x.x.x.aar 拷贝到项的 libs 目录,并设置依赖,其中 x.x.x代表版本号。

    implementation(name: 'miit_mdid_1.0.10', ext: 'aar')
    

    2、将 supplierconfig.json 拷贝到项目 assets 目录下。(暂时不用修改,只需原样放到assets目录下即可,这个是给未来做准备的。如果想要使用VAID,可修改里边对应内容,特别是需要设置 appid 的部分,要去对应厂商的应用商店里注册自己的 app,来获取对应appid。)

    3,混淆设置

    -keep class com.bun.miitmdid.core.** {*;}
    

    4,设置 gradle 编译选项,这块可以根据自己对平台的选择进行合理配置

    ndk { 
       abiFilters 'armeabi-v7a','x86','arm64-v8a','x86_64','armeabi'
    } 
    packagingOptions { 
      Android Q(12 月份会正式支持)
      doNotStrip "*/armeabi-v7a/*.so"
      doNotStrip "*/x86/*.so"
      doNotStrip "*/arm64-v8a/*.so"
      doNotStrip "*/x86_64/*.so"
      doNotStrip "armeabi.so"
    }
    

    5,MiitHelper.java文件:

    public class MiitHelper implements IIdentifierListener {
    
        private AppIdsUpdater _listener;
    
        public MiitHelper(AppIdsUpdater callback) {
            _listener = callback;
        }
    
    
        public void getDeviceIds(Context cxt) {
            long timeb = System.currentTimeMillis();
            int nres = CallFromReflect(cxt);
            //        int nres=DirectCall(cxt);
            long timee = System.currentTimeMillis();
            long offset = timee - timeb;
            if (nres == ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT) {//1008612 不支持的设备
                MyApplicationLike.setIsSupportOaid(false, nres);
            } else if (nres == ErrorCode.INIT_ERROR_LOAD_CONFIGFILE) {//1008613 加载配置文件出错
                MyApplicationLike.setIsSupportOaid(false, nres);
            } else if (nres == ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT) {//1008611 不支持的设备厂商
                MyApplicationLike.setIsSupportOaid(false, nres);
            } else if (nres == ErrorCode.INIT_ERROR_RESULT_DELAY) {//1008614 获取接口是异步的,结果会在回调中返回,回调执行的回调可能在工作线程
                MyApplicationLike.setIsSupportOaid(false, nres);
            } else if (nres == ErrorCode.INIT_HELPER_CALL_ERROR) {//1008615 反射调用出错
                MyApplicationLike.setIsSupportOaid(false, nres);
            }
            Log.d(getClass().getSimpleName(), "return value: " + String.valueOf(nres));
    
        }
    
    
        /*
         * 通过反射调用,解决android 9以后的类加载升级,导至找不到so中的方法
         *
         * */
        private int CallFromReflect(Context cxt) {
            return MdidSdkHelper.InitSdk(cxt, true, this);
        }
    
        /*
         * 直接java调用,如果这样调用,在android 9以前没有题,在android 9以后会抛找不到so方法的异常
         * 解决办法是和JLibrary.InitEntry(cxt),分开调用,比如在A类中调用JLibrary.InitEntry(cxt),在B类中调用MdidSdk的方法
         * A和B不能存在直接和间接依赖关系,否则也会报错
         *
         * */
        private int DirectCall(Context cxt) {
            MdidSdk sdk = new MdidSdk();
            return sdk.InitSdk(cxt, this);
        }
    
        @Override
        public void OnSupport(boolean isSupport, IdSupplier _supplier) {
            if (_supplier == null) {
                return;
            }
           /* String oaid=_supplier.getOaid();
            String vaid=_supplier.getVAID();
            String aaid=_supplier.getAAID();
            String udid=_supplier.getUDID();
            StringBuilder builder=new StringBuilder();
            builder.append("support: ").append(isSupport?"true":"false").append("\n");
            builder.append("UDID: ").append(udid).append("\n");
            builder.append("OAID: ").append(oaid).append("\n");
            builder.append("VAID: ").append(vaid).append("\n");
            builder.append("AAID: ").append(aaid).append("\n");
            String idstext=builder.toString();*/
    
            MyApplicationLike.setIsSupportOaid(isSupport);
    
            String oaid = _supplier.getOAID();
            _supplier.shutDown();           //关闭接口
            if (_listener != null) {
                _listener.OnIdsAvalid(oaid);
            }
        }
    
        public interface AppIdsUpdater {
            void OnIdsAvalid(@NonNull String ids);
        }
    
    }
    

    6,MyApplicationLike.java代码:

    初始化SDK:在应用的 application 的 attachBaseContext方法中调用方法: JLibrary.InitEntry(base);

    public class MyApplicationLike extends Application {
    
        private static String oaid;
        private static boolean isSupportOaid=true;
        private static int errorCode;
    
        public static String getOaid() {
            return oaid;
        }
        public static String getErrorCode() {
            return String.valueOf(errorCode);
        }
    
        public static boolean isSupportOaid() {
            return isSupportOaid;
        }
    
        public static void setIsSupportOaid(boolean isSupportOaid) {
            MyApplicationLike.isSupportOaid = isSupportOaid;
        }
        public static void setIsSupportOaid(boolean isSupportOaid,int ErrorCode) {
            MyApplicationLike.isSupportOaid = isSupportOaid;
            MyApplicationLike.errorCode=ErrorCode;
        }
    
        private static MyApplicationLike instance;
        public static MyApplicationLike getInstance() {
            return instance;
        }
        
        private MiitHelper.AppIdsUpdater appIdsUpdater = new MiitHelper.AppIdsUpdater() {
            @Override
            public void OnIdsAvalid(@NonNull String ids) {
    //            Log.e("++++++ids: ", ids);
                oaid = ids;
            }
        };
    
        @Override
        public void onCreate() {
            super.onCreate();
            instance = this;
            //获取OAID等设备标识符
            MiitHelper miitHelper = new MiitHelper(appIdsUpdater);
            miitHelper.getDeviceIds(instance);
            
        }
    
        @Override
        protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            JLibrary.InitEntry(base);
        }
    
    }
    

    7,获取oaid:

        public static String getOaid() {
            String idfa;
            if (MyApplicationLike.isSupportOaid()) {
                idfa = MyApplicationLike.getOaid();
            } else {
                idfa = "获取失败,ErrorCode: " + MyApplicationLike.getErrorCode();
            }
            return idfa;
        }
    

    其他详情请查看解压后的集成文档详细描述。

    展开全文
  • 全球唯一标识符(GUID)是一个字母数字标识符,用于指示产品唯一性安装。在许多流行软件应用程序(例如Web浏览器和媒体播放器)中,都使用GUID。GUID格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个x是...

    参考改进于http://blog.csdn.net/jcicheng/article/details/743934

     

    全球唯一标识符 (GUID) 是一个字母数字标识符,用于指示产品的唯一性安装。在许多流行软件应用程序(例如 Web 浏览器和媒体播放器)中,都使用 GUID。

    GUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。例如:6F9619FF-8B86-D011-B42D-00C04FC964FF 即为有效的 GUID 值。

    为什么要用GUID?
    世界上的任何两台计算机都不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性的标识符。在 Windows 平台上,GUID 应用非常广泛:注册表、类及接口标识、数据库、甚至自动生成的机器名、目录名等。
    曾经看到一篇随笔,说在数据库中使用GUID做key的好处,我一直是这么用的,但是就是两个guid比较的时候有些问题,通常我会ToString(),呵呵!

    最近做一个项目,同时存在.net和asp页面,而且asp页面的注册认证用的是session, 我在新的.net中使用的当然也是session, 搞得在.net中登录后还有在asp中再登录一下,切!最后利用sqlserver数据库+guid来传递登录信息,做到要去,下面截的asp 中生成guid的方法,生成的guid带"{xxxx}"

    Function GetGuid()
     Set TypeLib = Server.CreateObject("Scriptlet.TypeLib")
     GetGuid = TypeLib.Guid
     Set TypeLib = nothing
    End Function

    response.Write getguid() & "<br>"

    .net中使用guid就不用说了吧? System.Guid.Newguid().ToSring()    :-)

     

    JSP可以用UUID代替

    转载于:https://www.cnblogs.com/drkang/p/8449841.html

    展开全文
  • SID和NewSID详细说明 重新生成SID

    千次阅读 2010-07-20 12:57:00
    SID和NewSID详细说明SID也就是安全标识符(Security Identifiers),是标识用户、组和计算机帐户唯一号码。在第一次创建该帐户时,将给网络上每一个帐户发布一个唯一 SID。Windows 2000 中内部进程将...

    SID和NewSID的详细说明

    SID也就是安全标识符(Security Identifiers),是标识用户、组和计算机帐户的唯一的号码。在第一次创建该帐户时,将给网络上的每一个帐户发布一个唯一的 SID。Windows 2000 中的内部进程将引用帐户的 SID 而不是帐户的用户或组名。如果创建帐户,再删除帐户,然后使用相同的用户名创建另一个帐户,则新帐户将不具有授权给前一个帐户的权力或权限,原因是该帐户 具有不同的 SID 号。安全标识符也被称为安全 ID 或 SID。

    SID的作用

    用户通过验证后,登陆进程会给用户一个访问令牌,该令牌相当于用户访问系统资源的票证,当用户试图访问系统资源时,将访问令牌提供给 Windows NT,然后 Windows NT 检查用户试图访问对象上的访问控制列表。如果用户被允许访问该对象,Windows NT将会分配给用户适当的访问权限。

    访问令牌是用户在通过验证的时候有登陆进程所提供的,所以改变用户的权限需要注销后重新登陆,重新获取访问令牌。

    SID号码的组成

    如果存在两个同样SID的用户,这两个帐户将被鉴别为同一个帐户,原理上如果帐户无限制增加的时候,会产生同样的SID,在通常的情况下SID是唯一的,他由计算机名、当前时间、当前用户态线程的CPU耗费时间的总和三个参数决定以保证它的唯一性。

    一个完整的SID包括:

    • 用户和组的安全描述

    • 48-bit的ID authority

    • 修订版本

    • 可变的验证值Variable sub-authority values

    例:S-1-5-21-310440588-250036847-580389505-500

    我们来先分析这个重要的SID。第一项S表示该字符串是SID;第二项是SID的版本号,对于2000来说,这个就是

    1;然后是标志符的颁发机构(identifier authority),对于2000内的帐户,颁发机构就是NT,值是5。然后表示一系列的子颁发机构,前面几项是标志域的,最后一个标志着域内的帐户和组。

    SID的获得

    开始-运行-regedt32-HKEY_LOCAL_MACHINE/SAM/SAM/Domains/Builtin/Aliases/Members,找到本地

    的域的代码,展开后,得到的就是本地帐号的所有SID列表。

    其中很多值都是固定的,比如第一个000001F4(16进制),换算成十进制是500,说明是系统建立的内置管理员帐号administrator,000001F5换算成10进制是501,也就是GUEST帐号了,详细的参照后面的列表。

    这一项默认是system可以完全控制,这也就是为什么要获得这个需要一个System的Cmd的Shell的原因了,当然如果权限足够的话你可以把你要添加的帐号添加进去。

    或者使用Support Tools的Reg工具:

    reg query "HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/ProfileList

    还有一种方法可以获得SID和用户名称的对应关系:

    1. Regedt32:

    HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion /ProfileList

    2. 这个时候可以在左侧的窗口看到SID的值,可以在右侧的窗口中ProfileImagePath看到不同的SID关联的用户

    名,比如%SystemDrive%/Documents and Settings/Administrator.momo这个对应的就是本地机器的管理员SID %SystemDrive%/Documents and Settings/Administrator.domain这个就是对应域的管理员的帐户

    另外微软的ResourceKit里面也提供了工具getsid,sysinternals的工具包里面也有Psgetsid,其实感觉原理都是读

    取注册表的值罢了,就是省了一些事情。

    SID重复问题的产生

    安装NT/2000系统的时候,产生了一个唯一的SID,但是当你使用类似Ghost的软件克隆机器的时候,就会产生不同的机器使用一个SID的问题。产生了很严重的安全问题。

    同样,如果是重复的SID对于对等网来说也会产生很多安全方面的问题。在对等网中帐号的基础是SID加上一个相关的标识符(RID),如果所有的工作站都拥有一样的SID,每个工作站上产生的第一个帐号都是一样的,这样就对用户本身的文件夹和文件的安全产生了隐患。

    这个时候某个人在自己的NTFS分区建立了共享,并且设置了自己可以访问,但是实际上另外一台机器的SID号码和这个一样的用户此时也是可以访问这个共享的。

    SID重复问题的解决

    下面的几个试验带有高危险性,慎用,我已经付出了惨痛的代价!

    微软在ResourceKit里面提供了一个工具,叫做SYSPREP,这个可以用在克隆一台工作站以前产生一个新的SID号

    码。 下图是他的参数

    这个工具在DC上是不能运行这个命令的,否则会提示

    但是这个工具并不是把所有的帐户完全的产生新的SID,而是针对两个主要的帐户Administrator和Guest,其他的帐号仍然使用原有的SID。

    下面做一个试验,先获得目前帐号的SID:

    S-1-5-21-2000478354-688789844-839522115

    然后运行Sysprep,出现提示窗口:

    确定以后需要重启,然后安装程序需要重新设置计算机名称、管理员口令等,但是登陆的时候还是需要输入原帐号的口令。

    进入2000以后,再次查询SID,得到:

    S-1-5-21-759461550-145307086-515799519,发现SID号已经得到了改变,查询注册表,发现注册表已经全部修改了,当然全部修改了 。

    另外sysinternals公司也提供了类似的工具NTSID,这个到后来才发现是针对NT4的产品,界面如下:

    他可不会提示什么再DC上不能用,接受了就开始,结果导致我的一台DC崩溃,重启后提示“安全账号管理器初始化失败,提供给识别代号颁发机构的值为无效值,错误状态0XC0000084,请按确定,重启到目录服务还原模式...”,

    即使切换到目录服务还原模式也再也进不去了!

    想想自己胆子也够大的啊,好在是一台额外DC,但是自己用的机器,导致重装系统半天,重装软件N天 ,所以再次提醒大家,做以上试验的时候一定要慎重,最 好在一台无关紧要的机器上试验,否则出现问题我不负责哦 。另外在Ghost的新版企业版本中的控制台已经加入了修改SID的功能,自己还没有尝试,有兴 趣的朋友可以自己试验一下,不过从原理上应该都是一样的。

    文章发表之前,又发现了微软自己提供的一个工具“Riprep”,这个工具主要用做在远程安装的过程中,想要同时安装上应用程序。管理员安装了一个标准的 公司桌面操作系统,并配置好应用软件和一些桌面设置之后,可以使用Riprep从这个标准的公司桌面系统制作一个Image文件。这个Image文件既包 括了客户化的应用软件,又把每个桌面系统必须独占的安全ID、计算机账号等删除了。管理员可以它放到远程安装服务器上,供客户端远程启动进行安装时选用。 但是要注意的是这个工具只能在单硬盘、单分区而且是Professional的机器上面用。

    下面是SID末尾RID值的列表,括号内为16进制:

    Built-In Users

    DOMAINNAME/ADMINISTRATOR

    S-1-5-21-917267712-1342860078-1792151419-500 (=0x1F4)

    DOMAINNAME/GUEST

    S-1-5-21-917267712-1342860078-1792151419-501 (=0x1F5)

    Built-In Global Groups

    DOMAINNAME/DOMAIN ADMINS

    S-1-5-21-917267712-1342860078-1792151419-512 (=0x200)

    DOMAINNAME/DOMAIN USERS

    S-1-5-21-917267712-1342860078-1792151419-513 (=0x201)

    DOMAINNAME/DOMAIN GUESTS

    S-1-5-21-917267712-1342860078-1792151419-514 (=0x202)

    Built-In Local Groups

    BUILTIN/ADMINISTRATORS S-1-5-32-544 (=0x220)

    BUILTIN/USERS S-1-5-32-545 (=0x221)

    BUILTIN/GUESTS S-1-5-32-546 (=0x222)

    BUILTIN/ACCOUNT OPERATORS S-1-5-32-548 (=0x224)

    BUILTIN/SERVER OPERATORS S-1-5-32-549 (=0x225)

    BUILTIN/PRINT OPERATORS S-1-5-32-550 (=0x226)

    BUILTIN/BACKUP OPERATORS S-1-5-32-551 (=0x227)

    BUILTIN/REPLICATOR S-1-5-32-552 (=0x228)

    Special Groups

    /CREATOR OWNER S-1-3-0

    /EVERYONE S-1-1-0

    NT AUTHORITY/NETWORK S-1-5-2

    NT AUTHORITY/INTERACTIVE S-1-5-4

    NT AUTHORITY/SYSTEM S-1-5-18

    NT AUTHORITY/authenticated users S-1-5-11 *.(over)

    NewSID ,顾名思义,就是可以利用它来为计算机重新生成新的SID号。为什么要重新定义新SID?如果用Ghost的镜像批量的来安装系统,那么它们的SID号必 然相同。若内部网络上计算机SID相同就会造成许多冲突,加入域也会有很大问题,甚至造成客户机无法加入到域。对于什么是SID?2楼已经有很详细的介 绍。

    Windows 安装光盘不是已经提供了Sysprep吗?什么还要用NewSID呢?

    1、 凡用过Sysprep的朋友都应该知道,如果用Sysprep来重新封装系统,在重启之后会要求我们重新输入产品序列号和重新添加用户,对于企业来说很多时候是不希望员工得到产品ID的,让非IT职员来完成系统任务也很有可能造成一些不必要的麻烦。

    2、 正是基于我们这些迫切需求,NewSID可谓是一个完美的解决方案。它提供三种方式来让我们重新生成SID:a.随机产生 b.从其它计算机复制 c.手工输入,以上这三种方式可以满足大多数用户的需求。我们还可以选择是否重新给计算机更名,最后也可以手工指定在SID重定义完成后是否重启计算机。

    3、 计算机重启之后不会让我们再次输入产品序列号,也不会让我们重新添加用户,这为我们减少了很多不必要的麻烦。

    总结:NewSID是一个相当Cool的小工具,大家一定要将其收到自己的工具箱中,以备不时之需。

     

    http://www.itabloid.cn/upload/newsid.rar

    展开全文
  • C++引用使用

    2020-06-23 10:58:08
    C++引用的使用 一、什么是引用 引用是C++在C的基础上新添加的一类数据类型,他的优点是既保留了C语言中指针操作的高效性...符号使用做引用变量的标识符的作用 二、声明引用类型变量时必须对其进行初始化,一旦初始化后

    C++引用的使用

    一、什么是引用

    引用是C++在C的基础上新添加的一类数据类型,他的优点是既保留了C语言中指针操作的高效性,又弥补了指针直接操作内存可能带来的安全性问题。

    1.1引用的声明方法

    数据类型标识符 & 引用变量名 =被引用变量名;

    【列1】

    int a ;
    int & b=a;		//定义一个引用变量b引用的的对象是a
    

    说明:

    一、&符号在C++中不再仅仅表示取地址,这里的&符号使用做引用变量的标识符的作用

    二、声明引用类型变量时必须对其进行初始化,一旦初始化后引用变量与被引用变量间的绑定关系不可被更改,即不允许引用变量再次绑定其他变量。

    三、为了保证使用引用的安全性,引用变量不可以被取地址,不同于*指针的方式引用无法进行指针似的偏移从而保证无法通过引用来直接修改内存

    四、引用实际上就是给被引用变量起了一个别名,通过操作引用可以实现对被引用变量的读写。

    五、不能建立一个数组的引用,因为数组是一个由若干元素构成的集合,所以无法建立一个数组的别名。

    1.2为什么C++要加入引用类型的变量,引用类型与指针类型的比较

    传统C语言中指针的优缺点

    在传统的C语言中我们想要通过函数来修改实参通常是使用指针的传递,让函数直接对内存进行操作,这样做的好处是高效,在传入参数的类型比较大时,比如字符串或数组,指针的传递相比直接的数值传递要快得多。但同样也带来了一个问题,那就是指针可以通过偏移访问不同的内存,一旦偏移量出现问题可能会访问到系统的关键位置,从而带来了安全性的问题。

    引用类型与指针类型的比较

    引用类型既保留了指针在函数传递参数时的高效性,引用变量又因为不能被访问地址从而不能进行偏移保证了访问地址的绝对安全。

    使用时的直接区别

    一、指针可以为null,引用变量必须在定义时被初始化

    二、引用变量与被引用变量一旦绑定就无法在修改,而指针可以

    二、引用变量的实际应用

    2.1引用变量作为函数形参声明

    函数名(参数数据类型 & 引用形参)

    【例】

    void swapr(int & a,int & b);  
    

    2.2引用类型在函数中的实际使用

    引用类型在函数中传递的作用可以等效于*指针的作用,但应用变量不需要额外加上取内容的标识符*,看起来更加的简洁。

    【例】

    void swapr(int & a,int & b)//实现传入实参值交换
    {
        int temp = a;	//临时变量保存a
        a=b;		//相比*a=*b的指针方式看起来更直观简洁
        b=temp;
        return 0;
    }
    

    2.3传参数时特殊情况——临时变量

    我们在调用函数时,往往传入的不是一个直接的变量名,而是一个值的表达式,如下面这种情况。

    int x,y;
    swapr(X+3,y+5);
    

    这时由于引用变量只能接受一个变量,故C++设计了一个临时变量用来先保存表达式的值,再将该临时变量交给引用变量引用。值得注意的是临时变量的数据类型是const的,因此在函数的声明与定义中也要进行相应的修改。

    void swapr(const int & a,const int & b); //声明与定义都要改为常引用
    

    2.4常引用的作用

    2.4.1常引用的声明

    const 数据类型 & 引用变量名 = 被引用变量名;

    【例】

    int b =3;
    const int & a = b;			//常引用定义
    a=1;						//错误,不能通过常引用修改被引用变量
    b=1;						//可以
    

    2.4.2为什么要使用常引用

    在介绍临时变量时我们已经知道了一些常引用的作用,除了能接受临时变量外常引用更重要的作用是增强代码的健壮性,如下面这种情况,我们并不需要修改传入参数,而只是想要读取传入变量的值,使用常引用就可以保证被引用变量的安全。

    int Square(const int & a)
    {
    	return a*a;
    }
    

    情况,我们并不需要修改传入参数,而只是想要读取传入变量的值,使用常引用就可以保证被引用变量的安全。

    int Square(const int & a)
    {
    	return a*a;
    }
    

    有些人可能会觉得有点脱裤子放屁的感觉,明明可以直接通过参数传递解决,切形参与实参间没有关系,也不会影响传入的实参。但是这里只是相对简单的变量传入,如果传入的变量是一个非常大的类型,使用参数间传递就需要通过内存的拷贝会产生额外的内存还有一系列的堆栈操作,既浪费时间又浪费空间。而使用常引用的优势就在这里体现了,常引用作为别名有指针传递的特性,传递的只是一个非常小的指针参数大大减少了传递参数的时间,又因为常引用无法取地址进行偏移和无法对被引用变量进行修改,既保证了内存的安全,又保障了被引用变量的安全。

    展开全文
  • c语言安全编码建议一

    千次阅读 2012-10-22 23:29:46
    用const限定不可修改变量不要在子作用域中复用变量.不要使用区别不明显的标识符。(数字1与小写字符l,数字0与小写字符o,数字2与自负z等)不要在一个生命中声明超过一个变量;(char *p, c;容易将c也看成指针型...
  • MISRA C是安全使用C编程语言一套准则,主要使用在安全关键嵌入式系统中。...编程风格类规则一个很好例子是规则5.3“在内部作用域中声明的标识符不应掩盖在外部作用域中声明的标识符”。这显然是一种关...
  • 在很多语言中已经存在,比如C/C++中,主要的作用是将某个变量修饰为常量 在JavaScript中也是如此,使用const修饰的标识符为常量,不可以再次赋值 2.什么时候使用const呢? 当我们修饰的标识符不会被再次赋值时,就...
  • const使用和注意点

    2020-06-06 13:10:02
    1.在很多语言中已经存在,比如C/C++中,主要的作用是将某个变量修饰为常量。 2.在JavaScript中也是如此,使用const修饰的标识符为常量,不可以再次赋值。 什么时候使用const呢? 当我们修饰的标识符不会被再次赋值时...
  • linux使用问题-进程

    2007-04-06 14:25:00
    1.进程通过pid来进行识别. 2.init进程是机器启动时开始第一个进程,pid为1.它主要作用是收集父进程已经消亡进程退出状态,以允许内核...有效用户标识符用于所有的安全检查,并且是进程当前有效唯一用户标识符.
  • c/c++_消除非标准警告

    2020-12-21 15:41:12
    在使用gcc/g++编译时,一旦不符合一些iso规范编译器就会报出警告,我们每个人写法不同,虽然标准是最安全,最规范写法,但是每个人还是有自己风格。 可以使用:__extension__ 标识符放到你代码前,来消除...
  • RID池管理

    2014-02-25 14:40:39
    安全主体会被分配一个唯一叫做安全标识符 (SID) 字母数字字符串。安全主体 SID 由一个域范围 SID 和一个具有唯一性相对标识符 (RID) 串接而成。RID 是在创建安全主体时由域中RID Master分配。RID ...
  • HTTPS 在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS 也会降低用户访问速度,增加网站服务器的计算资源消耗。 本文主要介绍 https 对用户体验的影响。 2 HTTP与HTTPS的概念和区别 (1)...
  • 有了唯一标识符以后,就可以创建一个线程安全的全局map来管理每个请求生命周期变量。 在go语言中,谷歌开发者不建议大家获取协程ID,主要是为了GC更好工作,滥用协程ID会导致GC不能及时回收内存。如果一个第三...
  • namespace用法

    2015-07-24 15:18:26
    在C语言中只有一个全局作用域,也就是C语言中所有全局标识符共享一个作用域。C语言中不同文件变量命名可能会有冲突 ,比较幸运是,在C++中提供了一个简洁方式来使用命名空间成员,一种安全的机制。一, 命名...
  • SID详解

    2012-10-11 12:32:36
    1.前言2.SID的作用3.SID号码的组成4.SID的获得5.SID重复问题的产生 Built-In UsersDOMAINNAMEGUESTDOMAINNAMEDOMAIN USERSDOMAINNAMEDOMAIN GUESTSBuilt-In Local ...SID也就是安全标识符(Security Identifie
  • 学过C都知道指针,刚开始学习指针时候,都会觉得指针很难,学完了指针才发现指针就是保存地址。...对引用所有操作,事实上都是作用在该引用所绑定对象上。 引用声明方法:类型标识符 &am...
  • 概念及作用域组是具有安全标识符(SID)安全主体,通过组member属性,即可包含其他安全主体(用户、计算机和其他组),以实现更简单管理。这里一定不要和OU搞混淆了,OU是没有SID,所以不能用于资源权限...
  • ES6补充

    2021-01-23 19:13:22
    当我们修饰的标识符不会被再次赋值时,就可以使用const保证数据安全性。 例:const a = 20; a = 3 //这种写法是错误,不可以修改 const name;//const修饰的标识符必须赋值 注意: 一旦给const修饰的标识符被...
  • 播放模式支持随机播放和单首歌曲循环播放,LastState变量的作用是标示主窗体原有状态。  调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。  SendMessageBynum,...
  • 但它们的作用是受限的,不仅受编译器的保护,也受执行期系统(runtime system)的保护。换句话说,Java有指针,但没有“指针运算”。这些我们称之为“references”的东西,我们可以将其想象为“安全的指针”(因为...
  • 什么是SID

    2012-05-27 10:11:37
    SID是一个缩写,最为常见的是SID( Security Identifiers)安全标识符,是标识用户、组和计算机帐户的唯一的号码。 SID的作用:  用户通过验证后,登陆进程会给用户一个访问令牌,该令牌相当于用户访问系统资源...
  • Node.js编程

    2017-04-17 20:08:09
    语法: 标识符 严格模式 注释与语句 关键字与保留字 标识符 - 变量名 - 函数名 - 对象成员名 - 函数参数 ...作用:消除ECMAScript老版本中不合理、不严谨、不安全支出,提升效率,为ECMASc
  • 3.7 是否可以安全地认为,一旦&&和||左边表达式已经决定了整个表达式结果,则右边表达式不会被求值? 3.8 为什么表达式printf("%d%d",f1(),f2());先调用了f2?我觉得逗号表达式应该确保从左到右求值顺序。...
  • 3.7 是否可以安全地认为,一旦&&和||左边表达式已经决定了整个表达式结果,则右边表达式不会被求值? 3.8 为什么表达式printf("%d%d",f1(),f2());先调用了f2?我觉得逗号表达式应该确保从左到右求值顺序。...
  • ='\n')代码…… 3.7 是否可以安全地认为,一旦&&和||左边表达式已经决定了整个表达式结果,则右边表达式不会被求值? 3.8 为什么表达式printf("%d%d",f1(),f2());先调用了f2?我觉得逗号表达式应该确保从...
  • Kotlin关键字

    2019-07-16 16:29:37
    软关键字: 这些关键字可以在它们不起作用的上下文中用作标识符。 修饰符关键字: 这些关键字也可以在代码中用作标识符。 Kotlin硬关键宇包括: as一一 用于做类型转换或为 import 语句指定别名 as?一一...
  • 3.7 是否可以安全地认为,一旦&&和||左边表达式已经决定了整个表达式结果,则右边表达式不会被求值? 36  3.8 为什么表达式printf(%d %d, f1(), f2()); 先调用了f2?我觉得逗号表达式应该确保从左到右求...
  • 3.7 是否可以安全地认为,一旦&&和||左边表达式已经决定了整个表达式结果,则右边表达式不会被求值? 65 3.8 为什么表达式printf("%d %d", f1(), f2()); 先调用了f2?我觉得逗号表达式应该确保从左到右求...
  •  - 消除代码运行一些不安全之处,保证代码运行的安全;  - 提高编译器效率,增加运行速度;  - 为未来新版本Javascript做好铺垫。  表现: 严格模式下, delete运算符后跟随非法标识符(即delete 不存在...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 136
精华内容 54
关键字:

安全标识符的作用