A handle is an abstract reference to some resource provided to you by another party (usually the OS), that you can hand back to the other party to reference that resource.
OSes often contain a handle table containing entities that users have created (open files, created semaphores, processes, threads, ...); the handle is (often implemented as) an integer index into this table. Your process does an open, the OS creates an entry in its handle table, marks it with your (process) name, and hands the index of that entry back to your process. When your process wants to do a read, it provides the handle integer to the OS, which looks it up in the table by simply using it as table index; it now knows which entity (file) your process wants to read from.
By putting your process id in the handle entry, the OS can tell if the handle is valid for the process. Your process can provide trash as a handle to the OS; if the handle slot matches, the OS will do what you want, regardless of how stupid it is. After all, its your resource.